这是文件:
line1
line2
⋮
line10
Total
Update time
我想要文件的第一部分,除了最后两行。
输出应如下所示:
line1
line2
⋮
line10
我怎样才能使用 BSD 头来实现这一点?或其他oneliner?
谢谢!
另一个 awk 选项:
cat <<file>> | awk -v len=$(wc -l <<file>> | awk '{print $1}') 'NR < len - 2 { print $0 }'
反转文件,删除前两行,然后反转:
tac file | sed 1,2d | tac
使用 awk,这将打印除最后两行之外的所有行。
awk '{a[j++]=$0}END{for(i=0;i<j-2;i++){print a[i]}}' filename
这个概念不使用太多缓冲区,即使对于非常大的文件或管道中的无尽流也很有用。它应该比迄今为止提供的任何其他解决方案都要好。您也不必等到结束才开始打印行。
awk 'BEGIN{X = 2; getline; a[NR % X] = $0; getline; a[NR % X] = $0}{print a[NR % X]; a[NR % X] = $0}'
NR 也可以用另一个计数器替换,0
如果涉及 NR 的限制,该计数器将自行重置。此外,它还取决于 awk 的实现,它如何清理自己并在每一N
行输入上重用内存,但这个概念已经存在。
awk 'BEGIN{X = 2; for(i = 0; i < X; ++i)getline a[i]}{i %= X; print a[i]; a[i++] = $0}'
就像是
head file.txt -n -2
应该可以工作,只要您的head
版本允许 -2 参数。我的 GNU 版本的 head 工作
$头--版本 头(GNU coreutils)5.97 版权所有 (C) 2006 Free Software Foundation, Inc. 这是免费软件。您可以根据以下条款重新分发它的副本 GNU 通用公共许可证。 在法律允许的范围内,不提供任何保证。 由大卫麦肯齐和吉姆迈耶林撰写。
这可能对您有用:
[root@gc-rhel6-x64 playground]# cat file
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
[root@gc-rhel6-x64 playground]# head -`expr \`wc -l < file\` - 2` file
line1
line2
line3
line4
line5
line6
line7
line8
这将获得除最后两行之外的文件
猫文件.txt | 头 -$(expr $(wc -l file.txt | cut -c-8) - 2 )
更改粗体部分进行修改。