各列にNAを含む行を削除します。

各列にNAを含む行を削除します。

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

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

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

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

答え1

そしてawk

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

2番目のフィールドから始めてフィールドを繰り返し、NA含まれていないフィールドが見つかった場合はその行を印刷します。その後、サイクルを終了します。

答え2

GNU sedの使用

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

簡単な説明:

g[0-9]\+\(\s*NA\s*\)\+$正規表現一致は、行の最後までg少なくとも1つの数字とその間に任意のスペースがある任意の数のsが続く正規表現一致です。NA

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

同じ意味を持つより標準的な正規表現は次のとおりです。

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

答え3

allPerl List::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

答え4

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

$ 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 

関連情報