如果第 5 列中有点则删除行

如果第 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

预期输出:

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

版本假设分隔符是空格,但您可以调整它。

表现:

Namrata 说(评论)sed脚本比脚本更快awk斯蒂芬·查泽拉斯认为grep等效的可能甚至更快......

相关内容