![通过 bash 中的 stdin 管道从文件中删除行](https://linux22.com/image/128387/%E9%80%9A%E8%BF%87%20bash%20%E4%B8%AD%E7%9A%84%20stdin%20%E7%AE%A1%E9%81%93%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E8%A1%8C.png)
使用这个脚本:
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
应用该命令。该命令删除行。d
NA
d
如果行号是全部如果你有,那么以下方法也会起作用:
some_command | sed 's/$/d/' | sed -f /dev/stdin test >output
wheresome_command
生成您要从文件中删除的行号test
。
第一个通过向每行添加 ased
将数字流转换为脚本。行读数将被解释为“删除第 100 行”。然后将其作为实际脚本输入到第二个脚本(它通过 读取脚本)并将其应用于文件。sed
d
100d
sed
/dev/stdin
test
shell 中了解进程替换的等效内容:
sed -f <( some_command | sed 's/$/d/' ) test >output
但如果您只想删除包含该字符串的行NA
,那么这是愚蠢的。
答案2
awk
如果只把这个写成一个命令会不会太无聊了?
awk '!/NA/' test
默认操作是针对整行,因此这与打印任何不包含 的行print
相同。!/NA/ { print $0 }
NA