いくつかのジャンクを削除し、単語を次の文字列で始まるキー番号に置き換えようとしています。
>ref|NC_035781.1|
>ref|NC_035782.1|
>ref|NC_035783.1|
>ref|NC_035784.1|
次に終わりたいです。
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
頑張った
sed 's/\>ref\|NC_03578\([0-9]\)\.1\|/>NC_03578\1\.1/g' chr.test | grep '>NC_'
テストした結果、次のように予想よりも多くの結果が得られました。
>NC_03578.1>>NC_03578.1r>NC_03578.1e>NC_03578.1f>NC_03578.1|>NC_035780.1|>NC_03578.1 >NC_03578.1C>NC_03578.1r>NC_03578.1a>NC_03578.1s>NC_03578.1s>NC_03578.1o>NC_03578.1s>NC_03578.1t>NC_03578.1r>NC_03578.1e>NC_03578.1a>NC_03578.1
...
私は何が間違っていましたか?
ベストアンサー1
主な問題は、あなたが脱出している>
場合は、単語境界の終わりとして動作し、代替演算子として動作|
する 。GNU sed
\>
\|
$ sed 's/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
変更されたコマンドは上に表示されます。そして行末に空白が少しあるようで、追加して.*
取り除きました。ジョブsed -n '/NC_/ s/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/p'
自体をラップするために使用されますgrep
。sed
また、使用することができますawk
$ awk -F'|' '/NC_/{print ">" $2}' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
-F'|'
|
フィールド区切り記号として定義されます。|
正規表現演算子ですが、FS
フィールド区切り文字(特殊awk変数に設定)が単一文字の場合、-F
正規表現とは見なされません。-F'[|]'
それとも-F'\\|'
機能するかもしれませんが、効率が悪くなります。/NC_/
入力ラインに以下が含まれている場合NC_
print ">" $2
>
文字と2番目のフィールドの印刷