sed逆参照使用時の問題

sed逆参照使用時の問題

いくつかのジャンクを削除し、単語を次の文字列で始まるキー番号に置き換えようとしています。

>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'自体をラップするために使用されますgrepsed


また、使用することができます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番目のフィールドの印刷

おすすめ記事