0

这是文件:

line1
line2
⋮
line10
Total
Update time

我想要文件的第一部分,除了最后两行。

输出应如下所示:

line1
line2
⋮
line10

我怎样才能使用 BSD 头来实现这一点?或其他oneliner?

谢谢!

4

7 回答 7

2

另一个 awk 选项:

cat <<file>> | awk -v len=$(wc -l <<file>> | awk '{print $1}') 'NR < len - 2 { print $0 }'
于 2013-09-21T19:55:26.547 回答
2

反转文件,删除两行,然后反转:

tac file | sed 1,2d | tac
于 2013-09-21T21:23:05.767 回答
2

使用 awk,这将打印除最后两行之外的所有行。

  awk '{a[j++]=$0}END{for(i=0;i<j-2;i++){print a[i]}}' filename
于 2013-09-21T19:43:30.013 回答
2

这个概念不使用太多缓冲区,即使对于非常大的文件或管道中的无尽流也很有用。它应该比迄今为止提供的任何其他解决方案都要好。您也不必等到结束才开始打印行。

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}'
于 2013-09-21T22:14:39.637 回答
1

就像是

head file.txt -n -2

应该可以工作,只要您的head版本允许 -2 参数。我的 GNU 版本的 head 工作

$头--版本
头(GNU coreutils)5.97
版权所有 (C) 2006 Free Software Foundation, Inc.
这是免费软件。您可以根据以下条款重新分发它的副本
GNU 通用公共许可证。
在法律允许的范围内,不提供任何保证。

由大卫麦肯齐和吉姆迈耶林撰写。
于 2013-09-21T19:24:58.710 回答
1

这可能对您有用:

[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

于 2013-09-21T20:29:36.303 回答
0

这将获得最后行之外的文件

文件.txt | 头 -$(expr $(wc -l file.txt | cut -c-8) - 2 )

更改粗体部分进行修改。

于 2013-09-21T19:45:02.583 回答