Text-Processing

刪除每列中包含 NA 的行

  • September 18, 2019

我有一個製表符分隔的文件,如下所示:

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

循環遍歷從第二個欄位開始的欄位,如果NA找到不包含的欄位,則列印該行。然後打破循環。

使用 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

引用自:https://unix.stackexchange.com/questions/542094