如何结合sed/grep与awk条件删除gro文件中指定行?
解决GRO文件删除特定行的问题
直接用awk实现(最简便)
你原来的命令是输出要删除的行,只需要对条件取反,就能保留不需要删除的行:
awk '!($2 ~ /^NA/ && $5 > 23)' doubled_system.gro > new.gro
这里的!表示逻辑非,满足$2以NA开头且$5>23的行会被过滤,剩下的行全部写入new.gro。
如果想直接修改原文件(操作前建议备份),可以用GNU awk的原地编辑功能:
gawk -i inplace '!($2 ~ /^NA/ && $5 > 23)' doubled_system.gro
结合sed实现(适合必须用sed的场景)
sed本身不擅长数值比较,得先通过awk定位要删除的行号,再用sed删除:
# 第一步:提取需要删除的行号 awk '$2 ~ /^NA/ && $5 > 23 {print NR}' doubled_system.gro > delete_lines.txt # 第二步:把行号转成sed删除命令,执行删除(-i.bak会生成原文件备份) sed -i.bak -f <(sed 's/$/d/' delete_lines.txt) doubled_system.gro
执行后原文件会被修改,同时生成doubled_system.gro.bak备份文件,不需要备份的话可以去掉.bak。
关于grep的说明
grep主要用于文本匹配,无法直接处理$5>23这种数值比较逻辑,强行结合awk提取特征再反向匹配容易出错,所以不推荐用grep来做这个需求。
内容的提问来源于stack exchange,提问作者ATSahin
相关产品推荐
相关产品推荐

