从文本文件中删除奇数行或偶数行

我需要删除文本文件中的奇数行来进行下采样。 我发现这个命令,

awk 'NR%2==0' file 

但它只打印terminal中的奇数行。 如何真正删除它们?

我真的不在乎偶数或奇数,我希望他们从文件中删除或打印在另一个文件中。 这只在terminal打印它们。

AWK

%是模数运算符, NR是当前行号,所以NR%2==0只适用于偶数行,并且会调用默认规则( { print $0 } )。 因此,为了只保存偶数行 ,将awk的输出重定向到一个新文件:

 awk 'NR%2==0' infile > outfile 

SED

你可以用sed完成同样的事情。 devnulls答案显示如何使用GNU sed 。 以下是没有~操作符的sed版本的替代方法:

保持奇数行

 sed 'n; d' infile > outfile 

保持连线

 sed '1d; n; d' infile > outfile 

使用GNU sed:

 sed -i '0~2d' filename 

从文件中删除偶数行。

删除奇数行:

 sed -i '1~2d' filename 

-i选项会使更改保存到文件中。

从手册引用:

 `FIRST~STEP' This GNU extension matches every STEPth line starting with line FIRST. In particular, lines will be selected when there exists a non-negative N such that the current line-number equals FIRST + (N * STEP). Thus, to select the odd-numbered lines, one would use `1~2'; to pick every third line starting with the second, `2~3' would be used; to pick every fifth line starting with the tenth, use `10~5'; and `50~0' is just an obscure way of saying `50'. 

不要把注意力集中在负面(去除线条)上,把重点放在正面(选择线条)上,你的解决方案也会跟随。 所以,而不是I need to remove odd lines你应该考虑I need to select even lines ,然后解决方案是简单的:

 awk '!(NR%2)' file 

如果要将结果保存到新文件中:

 awk '!(NR%2)' file > newfile 

或者回到原来的位置:

 awk '!(NR%2)' file > newfile && mv newfile file 

下面是一个awk示例,分别创建两个包含奇数行和偶数行的新文件:

 awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt 

用于将evens打印到新文件的Perl解决方案:

 perl -lne 'print if $. % 2 == 0' infile > outfile 

要打印赔率, == 1更改为== 0

$. 是行号

只保留在原始文件中:

 perl -i -lne 'print if $. % 2 == 0' infile 

同上,但是创建一个名为infile.bak的备份文件:

 perl -i.bak -lne 'print if $. % 2 == 0' infile 

这可能适合你(GNU sed):

  sed -n 'p;n' file # keep odd sed -n 'n;p' file # keep even