すべての列にNAを含む行を削除する


8

次のようなタブ区切りファイルがあります。

gene    v1  v2  v3  v4
g1  NA  NA  NA  NA
g2  NA  NA  2   3
g3  NA  NA  NA  NA
g4  1   2   3   2

各行のフィールド数は固定され、同じです。列2から最後までのすべての行のすべてのフィールドがNAである上記のファイルからそれらの行を削除します。次に、出力は次のようになります。

gene    v1  v2  v3  v4
g2  NA  NA  2   3
g4  1   2   3   2 

非NAフィールドが常に非負の整数である場合、\s\d「良い」行と「悪い」行を区別するのと同じくらい簡単な正規表現。
Roman Odaisky

バイオインフォマティクスの仕事をしているなら、なぜRを使用しないのですか
qwr

私は、コマンドラインツールを使用していますが、このファイルを生成するために、上流と私はあなたがこれを削除することができますRにもちろんR.で開くように、ファイルを保存する必要がない場合、私はawkのか、perlのソリューションを好むだろうので、is.na 私が考える場合は、チェック
user3138373

回答:


16

awk

awk '{ for (i=2;i<=NF;i++) if ($i!="NA"){ print; break } }' file

2番目のフィールドから始まるフィールドをループし、含まNAれていないフィールドが見つかった場合は行を出力します。その後、ループを解除します。


10

GNU sedの使用

sed -e '/g[0-9]\+\(\s*NA\s*\)\+$/d' filename

簡単な説明:

g[0-9]\+\(\s*NA\s*\)\+$正規表現一致のg後に少なくとも1桁の数字が続き、その後NAに行末までオプションのスペースを含む任意の数のsが続きます。

sed -e '/<regex>/d' 一致するすべての行を削除します <regex>

同じ意味を持つより標準的な正規表現は次のようになります。

sed -Ee '/g[0-9]+([[:space:]]*NA[[:space:]]*)+$/d' filename

4
\+\sは非標準の正規表現であり、単純なバージョン+またはsほとんどのsedバージョンで一致することに注意してください。\{1,\}代わりに\+との[[:space:]]代わりに使用\sして、移植可能なコードを作成します。
フィリポス

9

allPerlのリスト:: Utilのモジュールから:

$ perl -MList::Util=all -alne 'shift @F; print unless all { $_ eq "NA" } @F' file
gene  v1  v2  v3  v4
g2    NA  NA  2   3
g4    1   2   3   2

9

grep

egrep -v -x 'g[0-9]+([[:blank:]]+NA)*[[:blank:]]*' filename

これにより、grep は行全体()が一致する()行を表示しなくなります。-v-x

  • 最初の列が小文字のgで、その後に1桁以上の数字が続く
  • NAが後に続く空白の任意の数のインスタンス
  • オプションの末尾の空白

1
+1ですが、フィールドの数は固定されているため、グループ{4}*後ろではなくを使用できNA、最初の[[:blank:]]*を変更し[[:blank:]]+て空白の区切り文字を必須にすることもできます。とにかく、私は誰awkgrepが簡単に処理できるこれらの単純なフィルタリングの問題を解決するためにバズーカを引き出すことを主張する理由を理解したことがありません。
ケビン

フィードバックをありがとう、@ Kevin。最初の提案を組み込みましたが、すべてが NAである限り、*このソリューションが任意の数のNA列に対して等しく機能するように、他の提案を保持しています。
ジムL.

2

あなたは試すことができます:

$ grep -P '\t(?!NA(\t|$))' file

$ sed -e 'h;s/\tNA//g;/\t/!d;g' file

$ perl -MList::MoreUtils=any -F'\t' -lane 'print if any { ! /^NA$/ } @F[1..$#F]' file 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.