如何在awk中检测EOF?

use*_*562 10 awk eof

有没有办法确定当前行是否是输入流的最后一行?

uri*_*iel 11

特殊END模式仅在所有输入结束后才匹配.请注意,此模式不能与任何其他模式组合使用.

更有用的可能是getline伪函数,它重置$0到下一行并返回1,或者在EOF返回0的情况下!我认为这就是你想要的.

例如:

awk '{ if(getline == 0) { print "Found EOF"} }'
Run Code Online (Sandbox Code Playgroud)

如果您只处理一个文件,这将是等效的:

awk 'END { print "Found EOF" }'
Run Code Online (Sandbox Code Playgroud)


SDG*_*tor 9

你有两个选择,两种都很混乱.

  1. 将每个当前行的副本存储在临时变量中,然后使用END块处理它.
  2. 使用system命令在BEGIN块中运行"wc -l | getline"以获取文件中的行数,然后计算该值.

您可能需要稍微使用#2来运行它,但它应该可以工作.自从我做了任何awk以来已经有一段时间了.

  • 哎呀,我真的很讨厌那个选项2.但是选项1就是这样做的.选项1的+1. (2认同)

Ed *_*ton 6

这些是按照从最好到最差的顺序做你想做的事情的唯一明智的方法:

awk 'NR==FNR{max++; next} FNR == max { print "Final line:",$0 }' file file

awk -v max="$(wc -l < file)" 'FNR == max { print "Final line:",$0 }' file

awk 'BEGIN{ while ( (getline dummy < ARGV[1]) > 0) max++; close(ARGV[1])} FNR == max { print "Final line:",$0 }' file
Run Code Online (Sandbox Code Playgroud)


two*_*rec 6

gawk实现有一个特殊的规则,称为ENDFILE在处理参数列表中的每个文件后将触发该规则。这有效:

awk '{line=$0} ENDFILE {print line}' files...
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多详细信息>>