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

Sam*_*NLP 39 linux awk sed

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

awk 'NR%2==0' file
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*hor 76

AWK

%是一个模数运算符,NR是当前行号,因此NR%2==0仅对偶数行才有效,并将调用它们的默认规则({ print $0 }).因此,要仅保存偶数行,请将输出重定向awk到新文件:

awk 'NR%2==0' infile > outfile
Run Code Online (Sandbox Code Playgroud)

SED

你可以完成同样的事情sed.devnulls答案显示了如何做到这一点GNU sed.以下是sed没有~运营商的版本的替代方案:

保持奇怪的线条

sed 'n; d' infile > outfile
Run Code Online (Sandbox Code Playgroud)

保持均匀的线条

sed '1d; n; d' infile > outfile
Run Code Online (Sandbox Code Playgroud)

  • 好东西; 只是为了完成图片:`awk'NR%2!= 0'infile> outfile`保存*odd*行; 使用`awk`,你不能用'sed`代替输入文件*,你可以:使用选项`-i''`(在Linux上,只有`-i`也可以). (3认同)

dev*_*ull 12

使用GNU sed:

sed -i '0~2d' filename
Run Code Online (Sandbox Code Playgroud)

从文件中删除偶数行.

删除奇数行:

sed -i '1~2d' filename
Run Code Online (Sandbox Code Playgroud)

-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'.
Run Code Online (Sandbox Code Playgroud)

  • 大; 为了潜在地保存其他人去"man sed":地址`m~n`意味着:"从第m行开始并在第n行之后匹配"(和"d"表示"删除"). (6认同)

pot*_*ong 6

这可能对您有用(GNU 和非 GNU sed):

 sed -n 'p;n' file # keep odd
 sed -n 'n;p' file # keep even
Run Code Online (Sandbox Code Playgroud)

-n: 抑制打印

p: 打印当前行

n: 下一行

  • `-n` 表示禁止打印。`p` 表示打印这一行。`n` 表示下一行。 (2认同)

Ed *_*ton 5

不要专注于消极(删除线),专注于积极(选择线),你的解决方案也会效仿.因此,I need to remove odd lines您应该思考I need to select even lines,然后解决方案就是:

awk '!(NR%2)' file
Run Code Online (Sandbox Code Playgroud)

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

awk '!(NR%2)' file > newfile
Run Code Online (Sandbox Code Playgroud)

或者回到原文:

awk '!(NR%2)' file > newfile && mv newfile file
Run Code Online (Sandbox Code Playgroud)