我有一个文件,如果它在第 5 列中有一个点,我想删除所有行。
输入文件:
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
Run Code Online (Sandbox Code Playgroud)
预期输出:
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
Run Code Online (Sandbox Code Playgroud)
注意:该文件大小为 64G,其中有 690,000,000 行。是否有一个有效的解决方案,因为它是一个相当大的数据集。我更喜欢 Awk 和 Sed,因为我是该领域的新手。谢谢你的帮助。
小智 9
你可以试试这个
awk '{ if ( $5 != "." ) { print $0; } }' input_file.Txt > output_file.txt
Run Code Online (Sandbox Code Playgroud)
这将测试第 5 列是否不是点并显示该行。
随着grep
,假设列是制表符分隔,这里使用ksh93的/ zsh的/ bash的$'...'
报价:
LC_ALL=C grep -v $'^\([^\t]*\t\)\{4\}\.\t'
Run Code Online (Sandbox Code Playgroud)
如果列由任意数量的空格分隔:
LC_ALL=C grep -vE '^([^[:blank:]]+[[:blank:]]+){4}\.[[:blank:]]'
Run Code Online (Sandbox Code Playgroud)
GNUgrep
通常比awk
(尤其是 GNU awk
)或sed
. 将语言环境设置为 C 通常也会加快速度。