我有多个文件,每个文件的编号或记录都不同。我想要一个 awk 命令来打印它们的倒数第二行并执行一些更改。我想要这样的东西:(这个当然行不通)
awk '( NR == FNR-1 ), $0","' *.txt
Run Code Online (Sandbox Code Playgroud)
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)