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

Nam*_*ata 6 sed awk

我有一个文件,如果它在第 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 列是否不是点并显示该行。

  • 更短:`awk '$5 != "."' input_file.Txt > output_file.txt` (14认同)

Sté*_*las 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 通常也会加快速度。