文字列を隣接する文字列に置き換える

文字列を隣接する文字列に置き換える

私のLinuxシステムには複数行のファイルがあり、構造は次のとおりです。

S    名前。足場開始寸法方向長さ順

私はそれに変更する必要があります。

S 足場。足場開始寸法方向長さ順

たとえば、次のように変更します。

s       Sapo.scaffold_1  19037   10      +       13588361        ATAATAAAAT
s       Rana.RANA1        9000   10      +       13588361        ATAATAAAAT
s       Sapo.scaffold_5  19037   10      +       13588361        ATAATAAAAT
s       Sapo.scaffold_8  19037   10      +       13588361        ATAATAAAAT
s       Coqu.SGBE0296.1  68900   10      +       13588361        ATAATAAAAT

到着する:

s       scaffold_1.scaffold_1  19037   10      +       13588361        ATAATAAAAT
s       RANA1.RANA1             9000   10      +       13588361        ATAATAAAAT
s       scaffold_5.scaffold_5  19037   10      +       13588361        ATAATAAAAT
s       scaffold_8.scaffold_8  19037   10      +       13588361        ATAATAAAAT
s       SGBE0296.1.SGBE0296.1  68900   10      +       13588361        ATAATAAAAT

ありがとうございます!

ベストアンサー1

sed 's/[[:alnum:]]*\.\([[:alnum:]_.]*\)/\1.\1/' file

その後、英数字の文字セットで始まり、その後にドットが続く文字列を探します。この行は削除されます。その後には、英数字、ドット、アンダースコアで構成される文字列が続きます。これはすべて、中央に点がある式の2番目の部分で2回置き換えられます。

問題のデータを考慮すると、次のような結果が得られます。

s       scaffold_1.scaffold_1   19037   10      +       13588361        ATAATAAAAT
s       RANA1.RANA1     9000    10      +       13588361        ATAATAAAAT
s       scaffold_5.scaffold_5   19037   10      +       13588361        ATAATAAAAT
s       scaffold_8.scaffold_8   19037   10      +       13588361        ATAATAAAAT
s       SGBE0296.1.SGBE0296.1   68900   10      +       13588361        ATAATAAAAT

これは、「名前」が一致し、[[:alnum:]]*「足場」が一致すると仮定されます[[:alnum:]_.]*

やや「賢い」正規表現は次のとおりです。

sed 's/[[:alnum:]]\{1,\}\.\([[:alnum:]]\{1,\}\([._][[:digit:]]\{1,\}\)\{0,1\}\)/\1.\1/' file

ドットの両側の部分文字列は空白にできず、足場サフィックス(_1または.1など)はオプションで足場名とは別に一致します。

拡張正規表現(おそらく読みやすさ)として、これは次のように書かれています。

sed -E 's/[[:alnum:]]+\.([[:alnum:]]+([._][[:digit:]]+)?)/\1.\1/' file

これは、与えられたデータに対する最初のコマンドと同じ出力を生成します。

おすすめ記事