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

时间:2014-01-23 13:03:45

标签: linux awk sed

我需要删除文本文件中的奇数行以进行下采样。我找到了这个命令,

awk 'NR%2==0' file

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

我并不关心偶数或奇数,我希望将它们从文件中删除或打印在另一个文件中。这只会在终端上打印出来。

6 个答案:

答案 0 :(得分:66)

AWK

%是模数运算符,NR是当前行号,因此NR%2==0仅对偶数行为真,并将为它们调用默认规则({{1} })。因此,仅保存偶数行,将{ print $0 }的输出重定向到新文件:

awk

SED

您可以使用awk 'NR%2==0' infile > outfile 完成同样的事情。 devnulls答案显示了如何使用sed进行操作。 以下是没有GNU sed运算符的sed版本的替代方法:

保持奇数行

~

保持连线

sed 'n; d' infile > outfile

答案 1 :(得分:11)

使用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'.

答案 2 :(得分:5)

不要专注于消极(删除线条),专注于积极(选择线条),您的解决方案也会效仿。因此,您应该考虑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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

这可能适合你(GNU sed):

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

答案 5 :(得分:1)

用于打印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