web-dev-qa-db-ja.com

すべての列に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

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

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

awkの場合:

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

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

16
Freddy

GNU sedを使用

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

簡単な説明:

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

_sed -e '/<regex>/d'_は、_<regex>_に一致するすべての行を削除します

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

_sed -Ee '/g[0-9]+([[:space:]]*NA[[:space:]]*)+$/d' filename
_
10
eike

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
9
steeldriver

grepの場合:

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

これにより、grepはnot display(-v)行全体(-x)一致:

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

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

$ 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 
2
Rakesh Sharma