我有一个简单的文件,由我的awk脚本处理:
AAAAA BBBBBB
CCCCC DDDDDD
EEEEE FFFFFF
GGGGG HHHHHH
IIIII JJJJJJ
首先,我想打印出最后一行,所以我从
开始#!/usr/bin/awk
{if (NR==5){print $0;}}
得到IIIII JJJJJJ
。
现在我要打印第5行后打印第2行。所以我将脚本更改为:
#!/usr/bin/awk
{if (NR==5){print $0; NR=2;}
if (NR==2){print $0;}
但在这种情况下,它是一个永无止境的循环。如何先打印第5行然后再打印第2行而不再打印第5行?
为清晰起见,预期输出:
IIIII JJJJJJ
CCCCC DDDDDD
答案 0 :(得分:5)
这个怎么样:
awk '{if (NR==2){x=$0} else if (NR==5) {y=$0}} END {print y; print x}' input
当我们逐行扫描文件时,我们将感兴趣的行存储在一些变量中,然后在最后打印它们。
这是一个稍微简单的选择:
awk '{if (NR==2){x=$0} else if (NR==5) {print $0; print x}}' input
这只将第2行存储在变量中。当我们到达第5行时,我们打印它然后从变量打印第2行。
编辑:正如William Pursell指出的那样,编写上述代码的更惯用的方法是
awk 'NR==2 {x=$0} NR==5 {y=$0} END {print y; print x}' input
和
awk 'NR==2 {x=$0} NR==5 {print $0; print x}' input
答案 1 :(得分:2)
通过反转输入文件(逐行)的替代解决方案..需要知道输入文件中的行数并相应地调整NR
:
$ tac ip.txt | awk 'NR==1 || NR==4'
IIIII JJJJJJ
CCCCC DDDDDD