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

我有以下文件

# header1 header2 zzzz yyyy 1 kkkkk wwww 2 

我想要做的是删除除了标题产生的奇数行:

 # header1 header2 zzzz yyyy kkkkk wwww 

我尝试过,但也删除标题

 awk 'NR%2==0' 

什么是正确的方法来做到这一点?

适用于GNU sed

 sed '3~2d' ip.txt 

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

例:

 $ seq 10 | sed '3~2d' 1 2 4 6 8 10 
 awk 'NR==1 || NR%2==0' 

如果记录号码是1或者是偶数,则打印它。

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

反转比较可能会稍微快一点。 差别可能是不可测量的。 (间距的选择实质上也是非常重要的。)

您只需

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

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

 awk 'NR==1 || !(NR%2)' file 
  • 对于偶数行(NR%2)变为0,否定就成为打印行的真实条件
 sed '1!{N;P;d}' 

1! 在第一行以外的行(默认行为回显第一行)
N将下一行追加到当前行
P只打印两个中的第一个
d删除它们两个。

这可能适用于你(GNU sed):

 sed '1b;n;d' file 

但:

 sed '3~2d' file 

很整齐。