ファイルがあり、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 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
同等の方が速いかもしれないと思った…