我有一个制表符分隔的文件,如下所示:
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
后跟至少一位数字,然后是任意数量的NA
s,其间有可选空格,直到行尾。
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