AwK将较长的列与下一行对齐,并保持相同数量的已处理行/行 [英] AwK align longer columns to next line and keep same count of processed rows/lines

查看:119
本文介绍了AwK将较长的列与下一行对齐,并保持相同数量的已处理行/行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对这种类型的输入数据有此问题:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆