最初の行を参照として使用して、すべての行で特定の文字の一致を置き換えます。

最初の行を参照として使用して、すべての行で特定の文字の一致を置き換えます。

H、最初の行を参照として使用して、すべての行で特定の文字の一致(.)を置き換えたいと思います。

私は別の質問から得た答えをもう一度ハッシュしてみました。

awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[$i] } NR>1 {for(i in a) if( $i == "\." ) $i="a"}1'

...上記のコードで書き直すアイデアは、最初の文字行を「a」に保存し、行> 1に「.」が表示されたら、「.」をその行に変更することです。 "a"に保存""の対応する列文字です。しかし、それはうまくいきませんでした。

入力する:

A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
.|C|G|A|T|T|.|.|G|C|.|.|.|A|C|R|C|.|T|T
A|.|.|.|N|.|T|T|N|.|.|A|C|.|.|R|.|.|.|.

希望の出力:

A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

ベストアンサー1

正しいアイデア - 間違った実装

  1. このフィールドを保存する必要があります。価値フィールド別に索引付けされた配列で場所。したがって、代わりa[$i]a[i]=$i

  2. その後、値を見つける必要がありますインデックス別配列から。だからそうでは$i="a"ありませんが$i=a[i]

ちなみに、$i == "\."これは正規表現テストではないので、逃げる必要はありません。.

$ awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[i]=$i } NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1' file
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

〜のようにエドモートンが指摘した。split、明示的なループをawk組み込み関数に置き換えることでソリューションを改善できます。

awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'

おすすめ記事