awk或sed - 删除特定行

时间:2015-03-19 09:55:27

标签: bash awk sed

我有这个

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

我想要这个

line1
line3
line5
line6
line8
line10
line11
line13
line15

如您所见,要删除的行从x + 2开始,然后是x + 3,x等于要删除的行号。

我用awk尝试了这个,但这不是正确的方法。

awk '(NR)%2||(NR)%3' file > filev1

任何想法为什么?

3 个答案:

答案 0 :(得分:3)

如果我正确解读您的要求,那么

awk 'NR % 5 != 2 && NR % 5 != 4' file

应该这样做。

答案 1 :(得分:2)

基于Wintermutes逻辑:)

awk 'NR%5!~/^[24]$/' file
line1
line3
line5
line6
line8
line10
line11
line13
line15

awk 'NR%5~/^[013]$/' file

工作原理。

我们可以从您的行中看到应删除*的那个并保留其他内容。

line1
line2*
line3
line4*
line5

line6
line7*
line8
line9*
line10

line11
line12*
line13
line14*
line15

将数据分组分组到每个5NR%5
我们看到要删除的行在每个组中都是24NR%5!~/^[24]$/'这将数据分为5组 然后,此部分/^[24]$/'告诉不要保留24 ^$非常重要,因此我也删除了12 47行, 由于12包含2。所以我们需要锚定它^2$^4$

答案 2 :(得分:2)

使用GNU sed,您可以执行以下命令:

 sed '2~5d;4~5d' test.txt