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
主要步骤:
- 遇到"AAAA "开头的行,置上found标记,并且把行内容保存到buffer里面。
- 遇到其他行:
- 如果当前found标记为true,那么打印buffer的内容和当前行内容,这个行为充当合并行的功能。
- 如果当前found标记为false,则是其他行,正常打印。
- BEGIN只在脚本开始的时候处理一次,不管数据文件有多少行。
- 脚本第三行有一个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 "开头的行。