次のようにタブ区切りのファイルがあります。
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
all
Perl 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