数百万行のファイルがあり、文字列が「.」の場合にのみ、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