头/尾的负参数


14

这个问题的变体当然已经在不同的地方被问过几次了,但是我试图M从文件中删除最后几行而没有运气。

第二个最投票的答案这个问题建议做以下摆脱在文件的最后一行:

head -n -1 foo.txt > temp.txt

但是,当我在OSX和Zsh中尝试该操作时,我得到:

head: illegal line count -- -1

这是为什么?我如何删除M 最后一个第一个 N给定文件的行?



1
输出是head --version什么?您正在使用什么系统?
jofel 2014年

@jofel head --version实际上返回错误。
2014年

Answers:


20

您可以使用以下方法删除前12行:

tail -n +13

(这意味着从第13行开始打印。)

某些head类似GNU的实现head支持:

head -n -12

但这不是标准的。

tail -r file | tail -n +12 | tail -r

可以在具有tail -rtac但也要是次优)的系统上工作。

n1:在哪里

sed '$d' file

您也可以这样做:

sed '$d' file | sed '$d'

删除2行,但这不是最佳选择。

你可以做:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

但是要注意,在某些实现中,它不适用于较大的nsed

awk

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

要删除m开头和n结尾的行:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

sed 'x;1d;$d'也可以用来获取最后两行。加上两个/ N之后的值1d可能会得到更多的收益,尽管在那一点上,它比N;P;D您已经建议的循环没有优势。
mikeserv

谢谢-最后一条命令非常有用。一个夏天的小告诫:它不工作的时候m或者n0。否则它将是完美的。
Amelio Vazquez-Reina

2

您可以使用以下方式删除前N行和后M行。

随着N=5M=7并且文件test.txt

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

该命令将打印从N + 1到LastLine-M的所有行。

另一个选择是使用python:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

您可以M使用以下命令从文件中删除最后一行(此处为M = 100):

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.