使用第一行作為參考替換所有行中的特定字元匹配

使用第一行作為參考替換所有行中的特定字元匹配

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”中,然後當看到“.”時在 rows>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

作為艾德·莫頓指出,您可以透過使用 awk 內建split函數替換顯式循環來改進解決方案:

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

相關內容