如何使用SED或AWK删除除第一行以外的奇数行

时间:2016-09-15 04:38:30

标签: linux awk sed

我有以下文件

# header1 header2
zzzz yyyy
1
kkkkk wwww
2

我想要做的是删除除标题之外的奇数行 得到以下特性:

# header1 header2
zzzz yyyy
kkkkk wwww

我尝试了这个,但它也删除了标题

awk 'NR%2==0'

做正确的方法是什么?

5 个答案:

答案 0 :(得分:4)

awk 'NR==1 || NR%2==0'

如果记录编号为1或是偶数,请将其打印出来。

awk 'NR % 2 == 0 || NR == 1'

反转比较可能会稍微快一些。差异可能无法衡量。 (并且间距的选择也基本上是无关紧要的。)

答案 1 :(得分:4)

适用于 GNU sed

sed '3~2d' ip.txt 

这将删除从第3行开始的行号,然后是+ 2,+ 4,+ 6等

示例:

$ seq 10 | sed '3~2d'
1
2
4
6
8
10

答案 2 :(得分:2)

你只需要

awk 'NR==1 || NR%2==0' file
  • 这使文件的标题部分保持不变并应用规则NR%2==0,这对于偶数行(从标题开始)是正确的,在这种情况下它将被打印。

上述相同答案的另一个变体

awk 'NR==1 || !(NR%2)' file
  • 对于偶数行(NR%2)变为0并且否定该行成为打印行的真实条件

答案 3 :(得分:2)

sed '1!{N;P;d}'

1!在第一行以外的行上(默认行为与第一行相呼应)
N将下一行附加到当前行 P仅打印两个中的第一个 d删除它们。

答案 4 :(得分:1)

这可能适合你(GNU sed):

sed '1b;n;d' file

可是:

sed '3~2d' file

远远不够。