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

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

私の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

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

答え2

awk '{
    sub(/[^.]*\./,"",$2) #From the 2nd field, remove all up to first dot
    $2=$2"."$2           #Replicate the resulting second field
    print
}' file | column -t

出力:

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

答え3

この試み、

awk -F '\t' '{$2=gensub(/\w+\.(.*)/,"\\1.\\1","g",$2);}1' file | column -t

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

関連情報