ファイルにランダムに表示される(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の$_
テーマ変数(.=words
Rakuの略語$_ = $_.words
)に戻すルーチンを使用して、入力をスペースで区切られた列に分割します。2番目の文では、最初の列を印刷してから
\t
タブ文字を印刷してから、最後に、3番目のステートメントは、最初の要素をスキップして(すでに印刷されているため)、最初に一致し、6より小さい値をキャプチャする要素を
grep
返すために使用されます。"(L=" (\d+) ")" $
&& $0 < 6
$0