元の文字列が特定の文字列と一致しない場合は、文字列を変更します。

元の文字列が特定の文字列と一致しない場合は、文字列を変更します。

数百万行のファイルがあり、文字列が「.」の場合にのみ、A列の値を変更したいと思います。修正は"chr:"$2":"$3文字列の先頭に追加されます。他のすべての行は元のバージョンで印刷されます。

入力例:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
. 3 7654 I R 8

上から4行目は「.」で始まります。 「chr3:7654」に変更する必要があります。他のすべての行は変更されていないままにしてください。

希望の出力:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
chr3:7654 3 7654 I R 8 2

私のコードはこれまで動作しますが、「rs ...」が同じままである必要がある場合でも、「chr ...」で始まるようにすべての名前を変更します。

awk '($1 ~ /^./) {$1 = "chr:"$2":"$3}1' filename > newfilename

これは非常に簡単な解決策ですが、非常に大きな問題を引き起こします。ありがとうございます!

答え1

問題は正規表現にあります。/^./行の先頭の有効な文字と一致します。.文字通り一致させるにはエスケープする必要があります。

awk '$1 ~ /^\./ {$1 = "chr:"$2":"$3};1' filename > newfilename

ただし、正規表現チェックを実行するのではなく、文字列が同じであることを確認する方が良いでしょう。

awk '$1 == "." {$1 = "chr:"$2":"$3};1' filename > newfilename

関連情報