各列のパターンで終わる文字列を削除します。

各列のパターンで終わる文字列を削除します。

ファイルにランダムに表示される(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) 

答え1

sed次の方法を使用してこれを実行できます。

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

を押してタブ文字を入力できます<ctrl-v><tab>。これが私が角括弧で始まるものです^

答え2

すべてのUnixシステムのすべてのシェルで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です。しかし、数字には意味があります。たとえば、1つのオプションはループをに置き換えることですre = "7|12|957|1045"

答え3

awk '{gsub(/\s*\S*L=([6-9]|1[0-9])\)/, "")}1' file

答え4

使用幸せ(以前のPerl_6)

raku -ne '.=words; print .[0] ~ "\t"; \
      put $_.skip.grep( { / "(L=" (\d+) ")" $ / && $0 < 6 } ).join: "\t";'  

入力例(タブで区切られた列):

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)
  • つまり、自動印刷ではなく1行ずつフラグを使用して行を読み取ります-ne

  • .=words.=オペレータは、結果要素をRakuの$_テーマ変数(.=wordsRakuの略語$_ = $_.words)に戻すルーチンを使用して、入力をスペースで区切られた列に分割します。

  • 2番目の文では、最初の列を印刷してから \tタブ文字を印刷してから、

  • 最後に、3番目のステートメントは、最初の要素をスキップして(すでに印刷されているため)、最初に一致し、6より小さい値をキャプチャする要素をgrep返すために使用されます。"(L=" (\d+) ")" $&& $0 < 6$0

https://raku.org

関連情報