使用awk从文件中删除第一行和最后一行的最简单方法是什么?

Ima*_*ion 22 awk

我正在学习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行.


0x8*_*00D 8

我建议另一个解决方案.如果您需要为顶部和底部线条定制N,您可以使用tailhead命令:

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的评论!

  • 我喜欢这个解决方案,但现在awk是多余的.你只需要做更多的文件名| 头-n -1 | 尾巴-n + 2` (2认同)