通过 bash 中的 stdin 管道从文件中删除行

通过 bash 中的 stdin 管道从文件中删除行

使用这个脚本:

awk '{print $0"\t"NR}' test | grep NA | awk '{print $21}'

我在文件中获取行号,其中包含“NA”

326
399
672
1512
1734
1737
2212

使用sed,我可以通过标准输入在同一命令中通过在最后一个 awk 命令后进行管道传输来从文件中删除这些行吗?如果没有的话,有没有什么简单的方法呢?

答案1

更简单的方法是仅使用sed

sed '/NA/d' test >test.new

如果您想使用 GNU 进行就地编辑sed(这将修改文件test):

sed -i '/NA/d' test

sed表达式将在输入中与正则表达式匹配的所有行上/NA/d应用该命令。该命令删除行。dNAd


如果行号是全部如果你有,那么以下方法也会起作用:

some_command | sed 's/$/d/' | sed -f /dev/stdin test >output

wheresome_command生成您要从文件中删除的行号test

第一个通过向每行添加 ased将数字流转换为脚本。行读数将被解释为“删除第 100 行”。然后将其作为实际脚本输入到第二个脚本(它通过 读取脚本)并将其应用于文件。sedd100dsed/dev/stdintest

shell 中了解进程替换的等效内容:

sed -f <( some_command | sed 's/$/d/' ) test >output

但如果您只想删除包含该字符串的行NA,那么这是愚蠢的。

答案2

awk如果只把这个写成一个命令会不会太无聊了?

awk '!/NA/' test 

默认操作是针对整行,因此这与打印任何不包含 的行print相同。!/NA/ { print $0 }NA

相关内容