我有一个文件,如果第五列中有一个点,我想删除所有行。
输入文件:
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G . 72 PASS N=2 F=5;U=4
sc2/68 20 . T A 71 PASS N=2 F=5;U=4
sc2/10 24 . T . 31 PASS N=2 F=5;U=4
sc2/40 59 . T . 31 PASS N=2 F=5;U=4
sc2/24 24 . A G 38 PASS N=2 F=5;U=4
预期输出:
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/68 20 . T A 71 PASS N=2 F=5;U=4
sc2/24 24 . A G 38 PASS N=2 F=5;U=4
注意:该文件大小为 64G,包含 690,000,000 行。是否有有效的解决方案,因为它是一个相当大的数据集。我更喜欢 Awk 和 Sed,因为我是该领域的新手。感谢您的帮助。
答案1
你可以试试这个
awk '{ if ( $5 != "." ) { print $0; } }' input_file.Txt > output_file.txt
这将测试第五列是否不是点并显示该线。
答案2
对于grep
,假设列是制表符分隔的,这里使用 ksh93/zsh/bash$'...'
引号:
LC_ALL=C grep -v $'^\([^\t]*\t\)\{4\}\.\t'
如果列之间有任意数量的空格分隔:
LC_ALL=C grep -vE '^([^[:blank:]]+[[:blank:]]+){4}\.[[:blank:]]'
GNUgrep
通常比awk
(尤其是 GNU awk
)或更快sed
。将语言环境设置为 C 通常也会加快速度。
答案3
awk '$5 != "."' your-big-file # from manatwork's comment
或者
sed -n '/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+\. /!p' your-big-file
Stephane Chazelas 评论的便携式版本:
sed -n '/^ *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *\. /!p' your-big-file
这sed版本假设分隔符是空格,但您可以调整它。
表现:
Namrata 说(评论)sed
脚本比脚本更快awk
。斯蒂芬·查泽拉斯认为grep
等效的可能甚至更快......