AWK:已经处理后打印行

时间:2016-09-24 20:58:21

标签: awk

我有一个简单的文件,由我的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

2 个答案:

答案 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