删除每列中包含 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

每行的字段数是固定且相同的。我想从上面的文件中删除这些行,其中从第 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

从第二个字段开始循环遍历字段,如果NA找到不包含的字段则打印该行。然后打破循环。

答案2

使用 GNU sed

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

简短说明:

g[0-9]\+\(\s*NA\s*\)\+$是一个正则表达式匹配,g后跟至少一位数字,然后是任意数量的NAs,其间有可选空格,直到行尾。

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 

相关内容