【发布时间】:2013-09-22 06:43:59
【问题描述】:
这是文件:
line1
line2
⋮
line10
Total
Update time
我想要文件的第一部分 except 用于最后 2 行。
输出应如下所示:
line1
line2
⋮
line10
如何使用 BSD head 来实现这一点?还是其他oneliner?
谢谢!
【问题讨论】:
这是文件:
line1
line2
⋮
line10
Total
Update time
我想要文件的第一部分 except 用于最后 2 行。
输出应如下所示:
line1
line2
⋮
line10
如何使用 BSD head 来实现这一点?还是其他oneliner?
谢谢!
【问题讨论】:
使用 awk,这将打印除最后两行之外的所有行。
awk '{a[j++]=$0}END{for(i=0;i<j-2;i++){print a[i]}}' filename
【讨论】:
另一个 awk 选项:
cat <<file>> | awk -v len=$(wc -l <<file>> | awk '{print $1}') 'NR < len - 2 { print $0 }'
【讨论】:
反转文件,先删除两行,再反转回来:
tac file | sed 1,2d | tac
【讨论】:
这个概念不使用太多缓冲区,即使对于非常大的文件或管道中的无穷无尽的流也很有用。它应该比迄今为止提供的任何其他解决方案都要好。您也不必等到结束才开始打印行。
awk 'BEGIN{X = 2; getline; a[NR % X] = $0; getline; a[NR % X] = $0}{print a[NR % X]; a[NR % X] = $0}'
NR 也可以替换为另一个计数器,如果涉及 NR 的限制,该计数器会将自身重置为0。它还取决于 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 工作
【讨论】:
这可能对你有用:
[root@gc-rhel6-x64 playground]# cat 文件
第1行
第2行
第3行
第4行
第 5 行
第6行
第 7 行
第8行
第9行
第10行
[root@gc-rhel6-x64 playground]# head -`expr \`wc -l < file\` - 2` file
第1行
第2行
第3行
第4行
第 5 行
第6行
第 7 行
第8行
【讨论】:
$() 代替反引号:head -$(expr $(wc -l < file) - 2) file
这将得到文件 except 最后 2 行
cat file.txt | head -$(expr $(wc -l file.txt | cut -c-8) - 2)
修改粗体部分。
【讨论】: