如何删除包含大量行的文件中第三行之后的每两行?

如何删除包含大量行的文件中第三行之后的每两行?

就像
如果我有:

1st line (keep)  
2nd line (keep)  
3rd line (keep)  
4rth lines (delete)  
5th (del)  
6th (keep)  
7nth (keep)  
8th lines  (keep)  
9th (del)  
10th (del)  
11th (keep)  
12th (keep)  
13th (keep)  
14th (del)  
15th (del)  

ETC....

答案1

尝试:

awk '(NR-1)%5<3' file

例如:

$ awk '(NR-1)%5<3' file
1st line (keep)
2nd line (keep)
3rd line (keep)
6th (keep)
7nth (keep)
8th lines (keep)
11th (keep)
12th (keep)
13th (keep)

怎么运行的

该命令(NR-1)%5<3告诉awk打印任何为(NR-1)%5<3真的行。在 中awkNR是行号,第一行计数为1。对于文件中的每五行,该语句对于前三行都是正确的。

答案2

一个简单的命令是:

awk '{if((NR-1) % 5<=2){print $0}}' file

它只会按 5 行的顺序打印前 3 行。因为(NR-1)%5会给出类似 的输出0 1 2 3 4,并且前 3 行小于等于 2。所以它只会打印它们。

我有包含内容的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

输出是:

1
2
3
6
7
8
11
12
13

或者按照评论中的建议您可以使用:

awk '(NR - 1) % 5 <= 2' file

答案3

基本上,你想要 awk 中类似“Fizz-Buzz”的东西......

awk '{ if (i++%5 < 3) print $0;}'

为了展示这个作品...

for x in 1 2 3 4 5 6 7 8 9 10 ; do echo $x; done |
awk '{ if (i++%5 < 3) print $0;}'

当您的文件被命名为“mybigfile.csv”时,

awk '{ if (i++%5 < 3) print $0;}' < mybigfile.csv > mybigfile-123.csv

答案4

这可以使用 GNU 来解决sed

sed '4~5,5~5d' file

请注意,这使用了 sed 标准的 GNU 特定扩展,因此不适用于 macOS 上的 BSD sed 等。但是,GNU sed 可以使用 macOS 安装brew,之后可以用作gsed.在 Linux 上,GNU sed 是默认设置。

这会打印每五行中不属于第四行到第五行的每一行;更清晰的示例:sed '3~10,6~10d'通过删除第 3 行到第 6 行来填充每组 10 行中的第 1、2、7、8、9、10 行。

得票最高的答案建议使用awk '(NR-1)%5<3'.在我的机器上,对于包含数字 1 到 200 万的文件,这大约需要 0.6 秒,而此答案中的 sed 解决方案大约需要 0.35 秒。这是合理的,因为 sed 通常是一个更简单的工具,因此比更复杂但功能更齐全的 awk 工作得更快。

相关内容