AwK将较长的列与下一行对齐,并保持相同数量的已处理行/行 [英] AwK align longer columns to next line and keep same count of processed rows/lines
问题描述
我对这种类型的输入数据有此问题:
Hi i have this problem with this type of input data:
包含这些列的输入文件:
input file which is contain those columns:
file1(原始文件)
file1 (original file)
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03
5 Lines processed
我试图使长列与下一行对齐,这是在以下代码的帮助下产生的:
I tried to make it align long columns to next line which is resulting with help of following code of:
awk '{for (i = 1; i <= NF; i += 9) print $i, $(i+1), $(i+2), $(i+3), $(i+4), $(i+5), $(i+6), $(i+7), $(i+8), $(i+9)}' file1
file1(已处理文件)
file1 (processed file)
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448
POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03
7 Lines processed
@Goal将根据您的想法使其输出像这样甚至更好,但仍保持相同数量的处理行
@Goal is to make it output like this or even better based on your idea, but still to keep same number of processed lines
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448
POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03
5 Lines processed
为了计数,我在下面使用此代码:但是在用AWK循环代码缩短后,它导致第7行出现NR
for counting i am using this code below: but after shortening with AWK loop code, it resulting into NR of lines 7
awk '{print $0;NR;}END {print "\n" "\033[48;5;085;38;5;000m" NR, "Lines processed""\033[0m";}'
感谢您提出任何建议
推荐答案
这是您要寻找的吗?
$ cat file
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03
$ cat tst.awk
{
for (i=1; i<=NF; i++) {
printf "%s%s", $i, (i<NF ? (i%9 ? OFS : ORS "\t") : ORS)
}
}
$ awk -f tst.awk file
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448
POSITION448 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03
$ awk -f tst.awk file | awk '!/^\t/{++c} END{print c+0, "Lines processed"}'
5 Lines processed
很显然,如果要在此处打印已处理的行数",则只需在第一个脚本的末尾打印NR,所以我假设您想从后续脚本中打印它,尽管我无法想象为什么.
Obviously you could just print NR in the END of the first script if you wanted to print the "Lines processed" number there so I'm assuming you want to print it from some subsequent script though I can't imagine why.
这篇关于AwK将较长的列与下一行对齐,并保持相同数量的已处理行/行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!