我有一个测试文件:
1
2
3
4
5
6
7
8
此命令打印文件的最后4行:
$ awk 'BEGIN{"wc -l < file" | getline b}{if(NR>b-4) print}' file
5
6
7
8
userpc@userpc-desktop
现在我想做同样的事情,但命令系统():
$ awk '{if( NR > (system("wc -l < file")-4) ) print}' file
8
1
8
2
8
3
8
4
8
5
8
6
8
7
8
8
userpc@userpc-desktop:
如何改进最后一个命令系统()?我还想打印文件的最后4行。 谢谢你的帮助。
答案 0 :(得分:13)
不需要awk,请使用tail
:
$ tail -4 your_file
答案 1 :(得分:8)
awk
绝对不是正确的工具。这样做很常见:sed '1{N;N;N;}; N; D; $p'
,你可以用awk做类似的事情:
awk '{for( i=0;i<3;i++) a[i]=a[i+1];a[3]=$0} END {print a[0],a[1],a[2],a[3]}' OFS='\n'
基本上,您可以跟踪看到的最后四行,并在到达文件末尾时将它们全部打印出来。你可以更加模糊和高效:
awk '{a[++i%4]=$0} END {print a[++i%4],a[++i%4],a[++i%4],a[++i%4]}' OFS='\n'
但是,真的,你为什么要这样做?
答案 2 :(得分:5)
如果您只想要一种机制来改善wc
在system
内的使用,请尝试:
awk 'NR > count-4' count=$( wc -l < file ) file
在awk中更多地执行此操作;
awk 'NR==1{ c="wc -l < " FILENAME; c | getline count } NR > count-4' input
这使用NR == 1而不是BEGIN,因为未在BEGIN块内定义FILENAME。
请注意,这两个都不使用awk中的system
,因为没有好的方法可以从system
获取输出,但是你可以做一些丑陋的事情:
awk 'NR==1 { system( "wc -l > tmpfile < " FILENAME ); getline count < "tmpfile" }
NR > count - 4' input
我无法强调这仅仅是一项学术活动。不要为此使用awk!
答案 3 :(得分:2)
tail
是正确的工具,但是如果你想在Awk中看到它:
awk '{b=b RS $0} b~/(\n.*){4}/{sub(/[^\n]*\n/,"",b)} END{print b}'
答案 4 :(得分:1)
awk 'NR==5, NR==8{print NR} file
从第5行到第8行打印
答案 5 :(得分:0)
以下是使用tac
和awk
的另一种方式:
$ tac file | awk 'NR==5{exit}1' | tac
5
6
7
8
tac
撤消文件。 awk
打印前4行并退出(如果您的文件非常大,那就很好)tac
再次撤消该文件