awk用法之:合并行

awk如何合并行

例如,把"^AAAA "开头的行,和它后面的行合并成一行,其他行正常输出。

$ cat -n t.txt 
     1  prefixion 1
     2  AAAA aaaa
     3  appending 1
     4  BBBB bbbb
     5  prefixion 2
     6  AAAA aaaa
     7  appending 2
     8  CCCC cccc

脚本:

$ cat -n t.sh
     1  awk '
     2    BEGIN     { found=0; buffer="" }
     3    /^AAAA /  { found=1; buffer=$0; next }
     4              { if (found == 1) {
     5                   printf "%s %s\n", buffer, $0
     6                   found=0
     7                } else {
     8                   printf "%s\n", $0
     9                }
    10              }
    11    ' t.txt

运行结果为:

prefixion 1
AAAA aaaa appending 1
BBBB bbbb
prefixion 2
AAAA aaaa appending 2
CCCC cccc

主要步骤:

  1. 遇到"AAAA "开头的行,置上found标记,并且把行内容保存到buffer里面。
  2. 遇到其他行:
    • 如果当前found标记为true,那么打印buffer的内容和当前行内容,这个行为充当合并行的功能。
    • 如果当前found标记为false,则是其他行,正常打印。
  3. BEGIN只在脚本开始的时候处理一次,不管数据文件有多少行。
  4. 脚本第三行有一个next指令,意思是直接退出脚本对当前行的处理,转而去处理下一行数据输入;反之假如没有next指令,则后面的语句会继续被执行,在我们的例子中,"AAAA "开头的行会被再打印两次,而后面的合并会无效;看运行的后果:
prefixion 1
AAAA aaaa AAAA aaaa
appending 1
BBBB bbbb
prefixion 2
AAAA aaaa AAAA aaaa
appending 2
CCCC cccc

因为第5行printf "%s %s\n", buffer, $0,其中buffer的内容和$0的内容都是一样的,即"AAAA "开头的行。

你可能感兴趣的:(awk用法之:合并行)