如何使用awk打印文件的倒数第二行

bus*_*bee 4 linux awk

我有多个文件,每个文件的编号或记录都不同。我想要一个 awk 命令来打印它们的倒数第二行并执行一些更改。我想要这样的东西:(这个当然行不通)

awk '( NR == FNR-1 ), $0","' *.txt
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

awk 读取记录,如果还没有读取记录,则不知道这些记录离结束有多远(很可能在读取和处理当前记录后添加额外的记录)。

与 相反sed,它甚至无法分辨哪条记录是最后一条记录(sed具有$它通过内部预先读取一条记录实际实现的地址,因此它知道哪条记录是最后一条记录)。

但是,在处理完每个输入文件(在语句中)之后,您可以在特殊END语句的末尾或使用 GNU进行一些处理。awkENDFILE

因此,您可以在处理最后两条记录时保存它们,然后在END/ENDFILE语句中,从保存它的位置调用倒数第二条记录。

例如:

awk '{prevlast = last; last = $0}
     END {if (NR >= 2) print "penultimate:", prevlast}' < input
Run Code Online (Sandbox Code Playgroud)

或者:

gawk '{prevlast = last; last = $0}
      ENDFILE {
       if (FNR >= 2) print "penultimate for", FILENAME ":", prevlast
      }' file1 file2
Run Code Online (Sandbox Code Playgroud)

或者将其概括为从末尾开始的n

awk -v n=2 '{saved[NR % n] = $0}
     END {if (NR >= n) print saved[(NR + 1) % n]}' < input

gawk -v n=2 '{saved[FNR % n] = $0}
     ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' file1 file2
Run Code Online (Sandbox Code Playgroud)