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

Jag*_*Jom 5 shell bash sed awk


就像
如果我有:

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)  
Run Code Online (Sandbox Code Playgroud)

等等....

Joh*_*024 13

尝试:

awk '(NR-1)%5<3' file
Run Code Online (Sandbox Code Playgroud)

例如:

$ 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)
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

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


Prv*_*dav 6

一个简单的命令是:

awk '{if((NR-1) % 5<=2){print $0}}' file
Run Code Online (Sandbox Code Playgroud)

它只会按 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
Run Code Online (Sandbox Code Playgroud)

输出是:

1
2
3
6
7
8
11
12
13
Run Code Online (Sandbox Code Playgroud)

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

awk '(NR - 1) % 5 <= 2' file
Run Code Online (Sandbox Code Playgroud)

  • 或者,习惯性地使用 `awk` 语法:`awk '(NR - 1) % 5 &lt;= 2' file` (3认同)

Chu*_*ill 5

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

awk '{ if (i++%5 < 3) print $0;}'
Run Code Online (Sandbox Code Playgroud)

为了展示这个作品......

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

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

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