Bash - 如何删除文件中每个第n行?

3

I have this

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个回答

8
你使用了正确的方法% 3 - 只是错了一位,因为你想要从第2行开始删除,而不是第3行。测试NR == 1是多余的,因为它在模数测试中已经包含了,但它并没有引起任何问题:
$ awk '(NR+1) % 3' file
line1
line3
line4
line6
line7
line9
line10
line12
line13
line15

有趣的是,对于简单问题的最简单答案获得的赞数比复杂问题的详细答案还要多。 - user4453924
1
@JID 我真的不能不同意。但是,让我们把它看作是为了解决复杂而默默无闻的问题所付出的努力所带来的因果报应吧。 - Ben Grimm
1
是的,我并不是恶意地说这个,只是当我看到一个非常好的回答只有1票时,我会为发帖人感到难过:( - user4453924

8
您可以使用GNU sed:
 sed -i '2~3d' test.txt

您可以删除-i,以防不想保存结果。
从sed手册中提取:

first~step 匹配从第一行开始的每一步第一行。 例如,sed -n 1~2p将打印输入流中所有奇数行,而地址2~5将匹配从第二行开始的每五行。


不错的替代方案,但请注意这仅适用于_GNU_ sed(鉴于OP没有要求进行原地更新,建议删除-i)。 - mklement0
1
你说得对,我忘了说这是 sed 的 GNU 扩展。我已经编辑了我的回答。 - Adam
@Azatik1000 我已经添加了对 man 手册的引用。 - Adam

3
忽略像你示例输出中的那些行,使用以下命令:
awk 'NR % 3 != 2' file

2

您可以使用:

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

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

2
这里有一种使用便携式的sed工具实现的方法。
删除每三行:
sed 'n; n; d' infile

删除每三行,从第二行开始:

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

输出:

line1
line3
line4
line6
line7
line9
line10
line12
line13
line15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接