用于多模式过滤字符串文件的Awk修正脚本是否可行?
Awk脚本过滤PDB文件的正确性验证
需求说明
从输入文件输出所有行,需排除两类行:
- 以"HETATM"开头且包含"lig"或"lih"的行
- 以"END"开头的行
最后在过滤后的文件末尾添加"END"。
原脚本问题
原脚本:
awk '!/^HETATM/ && /lig|lih |^END/; END {print "END"}' test.pdb >> ./processed.pdb
实际运行后几乎移除所有行,仅保留末尾手动添加的"END",文件内容为空。
错误原因:原脚本条件逻辑完全错误。它要求行不以"HETATM"开头,同时还要包含"lig"/"lih"或者以"END"开头。这意味着正常的非HETATM行(不含lig/lih)会被过滤,而原本要排除的"END"行反而被保留,最终导致绝大多数行不符合输出条件。
修正脚本的正确性验证
修正脚本:
awk '!/^HETATM.*(lig|lih)/ && !/^END/; END {print "END"}'
该脚本完全符合需求,逻辑拆解:
!/^HETATM.*(lig|lih)/:精准排除**以"HETATM"开头且后续包含"lig"或"lih"**的行,其余不含lig/lih的HETATM行会被保留&& !/^END/:同时排除所有以"END"开头的行END {print "END"}:在所有过滤完成的内容末尾添加"END"
综上,修正脚本能够正确实现需求。
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

