我正在学习awk/gawk.所以最近我只是尝试解决它的任何问题,以获得更多的练习机会.
我的同事昨天问了一个问题,
"如何从文件中删除第一行和最后一行"
.我知道那sed '1d;$d' file会有用.head/tail即使性能不佳也行得通.我告诉他sed,他很高兴.
后来,我试图写一个awk单行:到目前为止,我得到的是:
awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}'
Run Code Online (Sandbox Code Playgroud)
这会将整个文件存储在数组中,只是为了跳过最后一行.我觉得应该有一种更简单(或更好)的方式来做到这一点.
(如果没有更简单,更快或更好的方法,我会删除这个问题)
谢谢.
Wil*_*ell 53
这样做的诀窍:
awk 'NR>2 {print last} {last=$0}'
Run Code Online (Sandbox Code Playgroud)
awkprint last仅当NR> 2时(即,除了前2行之外的所有行),才执行动作.在所有行上,它将变量last设置为当前行.因此,当awk读取第三行时,它会打印第2行(存储在其中last).当它读取最后一行(第n行)时,它会打印第n-1行的内容.净效果是打印第2行到第n-1行.
我建议另一个解决方案.如果您需要为顶部和底部线条定制N,您可以使用tail和head命令:
awk '{print $1}' | head -n -1 | tail -n+2
Run Code Online (Sandbox Code Playgroud)
head -n -1 - 删除最后一行
tail -n + 2 - 从第二行开始输出(删除1行)
以下命令将从顶部和底部删除3行:
awk '{print $1}' | head -n -3 | tail -n +4
Run Code Online (Sandbox Code Playgroud)
实际上我们甚至不需要awk:
more | head -n -1 | tail -n +2
Run Code Online (Sandbox Code Playgroud)
要么
cat | head -n -1 | tail -n +2
Run Code Online (Sandbox Code Playgroud)
感谢Igor Fobia的评论!