bash - 如何删除文件的每个第n行

时间:2015-03-16 14:14:53

标签: bash awk

我有这个

line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
line11
line12
line13
line14
line15

我的目标是

line1
line3
line4
line6
line7
line9
line10
line12
line13
line15

我尝试了下面的代码,但它没有做我想要的。我不确定我做错了什么。

awk 'NR == 1 || NR % 3 != 0' file 

有关原因的任何线索?

5 个答案:

答案 0 :(得分:7)

你有正确的想法使用% 3 - 只是off by one,因为你想从第2行而不是3开始删除。NR == 1的测试是多余的,属于模数测试,但它没有造成任何麻烦:

$ awk '(NR+1) % 3' file
line1
line3
line4
line6
line7
line9
line10
line12
line13
line15

答案 1 :(得分:5)

你可以使用GNU sed:

 sed -i '2~3d' test.txt

如果您不想保存结果,也可以删除-i

答案 2 :(得分:3)

要忽略示例输出中的行,请使用

awk 'NR % 3 != 2' file

答案 3 :(得分:2)

您可以使用:

awk '(NR+1)%3' file
line1
line3
line4
line6
line7
line9
line10
line12
line13
line15

这将跳过从第2行开始的每第3行。因此将跳过第2,5,8,11,14行。

答案 4 :(得分:2)

以下是使用便携式sed进行此操作的一种方法。

要删除每第3行:

sed 'n; n; d' infile

要删除每第3行,请从第2行开始:

sed '1n; 2d; n; n; d' infile

输出:

line1
line3
line4
line6
line7
line9
line10
line12
line13
line15