head / tail 的否定参数

head / tail 的否定参数

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

得票数第二高的答案这个问题建议执行以下操作来删除文件中的最后一行:

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

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

head: illegal line count -- -1

这是为什么?我怎样才能删除M 最后的线第一的 N给定文件的行?

答案1

您可以使用以下命令删除前 12 行:

tail -n +13

(即从第13开始打印。)

headGNU支持的一些实现head

head -n -12

但这不是标准的。

tail -r file | tail -n +13 | tail -r

可以在那些具有tail -r(另请参见 GNU tac)但不是最优的系统上运行。

n1 在哪里:

sed '$d' file

您还可以这样做:

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

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

你可以做:

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

但请注意,这不适用于较大的值n与一些sed实现。

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}'

答案2

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

使用N=5,M=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

蟒蛇3:

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

要覆盖现有文件:

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

答案3

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

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt

相关内容