5列に点がある場合、行を削除

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

5番目の列が点でないことをテストし、線を表示します。

答え2

の場合、grep列がタブで区切られていると仮定すると、ksh93/zsh/bash$'...'引用符がここで使用されます。

LC_ALL=C grep -v $'^\([^\t]*\t\)\{4\}\.\t'

列がスペースで区切られた場合:

LC_ALL=C grep -vE '^([^[:blank:]]+[[:blank:]]+){4}\.[[:blank:]]'

GNUはgrep一般的にawk(特にGNU awksed。ロケールを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同等の方が速いかもしれないと思った…

関連情報