Awk

刪除以每列模式結尾的字元串

  • March 30, 2022

我想刪除文件中隨機出現的 (L=6), (L=7)…..(L=12) 的所有條目,格式如下;

我的輸入文件:

TRINITY_DN1910_c0_g1_i13    GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5) GO:0006030(L=9) GO:0006032(L=11)    GO:0006040(L=6)
TRINITY_DN1452_c0_g1_i11    GO:0005975(L=3) GO:0006022(L=9) GO:0006026(L=12)    GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5)

                                       

該文件是製表符分隔的。

預期產出

TRINITY_DN1910_c0_g1_i13    GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5)
TRINITY_DN1452_c0_g1_i11    GO:0005975(L=3) GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5) 

您可以使用sed以下方法執行此操作:

sed 's/GO:[^   ]*(L=[6-9])//g
    s/GO:[^ ]*(L=1[0-2])//g' filename

您可以按 輸入製表符<ctrl-v><tab>。這就是我在以 . 開頭的方括號中的內容^

在每個 Unix 機器上的任何 shell 中使用任何 awk:

$ awk '
   BEGIN {
       for (i=6; i<=12; i++) {
           re = re sep i
           sep = "|"
       }
       re = "\t[^\t]+[(]L=(" re ")[)]"
   }
   {
       gsub(re,"")
       print
   }
' file
TRINITY_DN1910_c0_g1_i13        GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5)
TRINITY_DN1452_c0_g1_i11        GO:0005975(L=3) GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5)

如果您有任何其他連續的數字範圍要處理,只需更改循環中的開始/結束數字。如果您在其中設置re了不連續的數字,BEGIN但是對於這些數字是有意義的,例如,一個選項可能是將循環替換為re = "7|12|957|1045".

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