次のようなタブ区切りファイルがあります。
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
awk
の場合:
awk '{ for (i=2;i<=NF;i++) if ($i!="NA"){ print; break } }' file
2番目のフィールドから始まるフィールドをループし、NA
を含まないフィールドが見つかった場合はその行を出力します。次にループを解除します。
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
_
Perl List :: Utilモジュールのall
を使用:
$ 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
grep
の場合:
egrep -v -x 'g[0-9]+([[:blank:]]+NA)*[[:blank:]]*' filename
これにより、grepはnot display(-v
)行全体(-x
)一致:
あなたは試すことができます:
$ 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