Заменить определенные совпадения символов во всех строках, используя первую строку в качестве ссылки

Заменить определенные совпадения символов во всех строках, используя первую строку в качестве ссылки

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'

Связанный контент