如何根据文件中的最小行删除前X行

时间:2016-11-11 21:00:23

标签: linux bash unix awk sed

我有一个包含10,000行的文件。使用以下命令,我将删除第10,000行之后的所有行。

sed -i '10000,$ d' file.txt

但是,现在我想删除前X行,使文件不超过10,000行。

我认为会是这样的:

sed -i '1,$x d' file.txt

$x将是超过10,000的行数。我有点坚持如何写if,然后是它的一部分。或者,我以为我可以使用原始命令而只是cat文件反向?

例如,如果我们只想从底部开始3行(在一些有用的答案之后似乎更简单):

输入:

Example Line 1
Example Line 2
Example Line 3
Example Line 4
Example Line 5

预期产出:

Example Line 3
Example Line 4
Example Line 5

当然,如果你知道一种更有效的编写命令的方法,我也会对此持开放态度。您的积极意见得到高度赞赏。

6 个答案:

答案 0 :(得分:10)

tail可以完全按照您的意愿行事。

tail -n 10000 file.txt

答案 1 :(得分:4)

为简单起见,我会反转文件,保留前10000行,然后重新反转文件。

它使文件就地保存更复杂

source=file.txt
temp=$(mktemp)
tac "$source" | sed '10000 q' | tac > "$temp" && mv "$temp" "$source"

如果不反转文件,你需要计算行数并做一些算术:

sed -i "1,$(( $(wc -l < file.txt) - 10000 )) d" file.txt

答案 2 :(得分:3)

保留前10000行:

head -n 10000 file.txt 

保留最后10000行:

tail -n 10000 file.txt

使用您的文件测试示例

tail -n 3 file.txt
Example Line 3
Example Line 4
Example Line 5

答案 3 :(得分:3)

$ awk -v n=3 '{a[NR%n]=$0} END{for (i=NR+1;i<=(NR+n);i++) print a[i%n]}' file
Example Line 3
Example Line 4
Example Line 5

如果你有GNU awk并希望进行“inplace”编辑,请添加-i inplace

答案 4 :(得分:2)

tac file.txt | sed "$x q" | tac | sponge file.txt

sponge命令在避免使用其他临时文件时非常有用。

答案 5 :(得分:2)

tail -10000 <<<"$(cat file.txt)" > file.txt

好吧,不是“只是”tail,但这样就可以进行原地截断。