複雑な文字列をファイルの列の1つに置き換えるには?

複雑な文字列をファイルの列の1つに置き換えるには?

次のファイルがあります(1kG_MDS5.bim)。

1   rs58108140  0   10583   A   G
1   1:11508[b37]A,G 0   11508   A   G
1   1:15820[b37]G,T 0   15820   T   G
1   1:16257[b37]C,G 0   16257   C   G
1   1:16378[b37]C,T 0   16378   T   C

2番目の列から[b37]エントリをすべて削除し、コンマをその列に置き換えて、最終結果が次のようになります。

1   rs58108140  0   10583   A   G
1   1:11508:A:G 0   11508   A   G
1   1:15820:G:T 0   15820   T   G
1   1:16257:C:G 0   16257   C   G
1   1:16378:C:T 0   16378   T   C

次のコマンドを実行してこの問題を部分的に解決しようとしました([b37]のみを削除)。

sed -i -E 's/([b37])/:/g' 1kG_MDS5.bim

しかし、私はこれを得ます:

1   rs58108140  0   1058:   A   G
1   1:11508[:::]A,G 0   11508   A   G
1   1:15820[:::]G,T 0   15820   T   G
1   1:1625:[:::]C,G 0   1625:   C   G

上記のように線が表示された最終結果を取得する方法を教えてください。 sedソリューションである必要はなく(awkがあれば良いでしょう)、ファイルには約600万行が含まれています。

答え1

次のことを試すことができます。

sed 's/\[b37\]\(.\),/:\1:/' 1kG_MDS5.bim

出力:

1   rs58108140  0   10583   A   G
1   1:11508:A:G 0   11508   A   G
1   1:15820:G:T 0   15820   T   G
1   1:16257:C:G 0   16257   C   G
1   1:16378:C:T 0   16378   T   C

パターンの問題は、角かっこがエスケープされていないため、sed文字列 "[b37]"の代わりにb、3、7の発生を置き換えようとすることです。

関連情報