首页 > 解决方案 > 在循环中打印第一行和最后 n 行 | awk

问题描述

我有一个包含 n 行的文本文件,我想打印第一行,然后打印最后 n 行,依此类推

我编写了如下代码,但希望它循环运行,直到覆盖所有行。

cat test6.txt | awk '{a[NR]=$0} NR<=1 {print} END{for (i=NR-n;i<=NR;i++) print a[i]}' n=3

猫 test6.txt

abc1
abc2
abc3
abc4
abc5
abc6
abc7
abc8
abc9
abc10
abc11
abc12
abc13

所以它的输出应该是

abc1
abc11
abc12
abc13
abc2
abc8
abc9
abc10
abc3
abc5
abc6
abc7
abc4

标签: shellawk

解决方案


$ cat tst.awk
{ a[NR] = $0 }
END {
    end = NR
    for (i=1; i in a; i++) {
        print a[i]
        delete a[i]
        for (j=end-n+1; j<=end; j++) {
            if ( j in a ) {
                print a[j]
                delete a[j]
            }
        }
        end -= n
    }
}

.

$ awk -v n=3 -f tst.awk file
abc1
abc11
abc12
abc13
abc2
abc8
abc9
abc10
abc3
abc5
abc6
abc7
abc4

推荐阅读