Ersetzen Sie bestimmte Zeichenübereinstimmungen in allen Zeilen, wobei Sie die erste Zeile als Referenz verwenden.

Ersetzen Sie bestimmte Zeichenübereinstimmungen in allen Zeilen, wobei Sie die erste Zeile als Referenz verwenden.

H, ich möchte bestimmte Zeichenübereinstimmungen (.) in allen Zeilen ersetzen und dabei die erste Zeile als Referenz verwenden

Bei meinem Versuch, eine Antwort noch einmal aufzuwärmen, gelangte ich zu einer anderen Frage:

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'

...die Idee der Überarbeitung, die ich im obigen Code ausprobiert habe, bestand darin, die ersten Zeilenzeichen in „a“ zu speichern und dann, wenn in Zeilen > 1 ein „.“ angezeigt wird, den „.“ in das entsprechende in „a“ gespeicherte Spaltenzeichen zu ändern. Aber das hat nicht funktioniert.

Eingang:

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|.|.|.|.

Gewünschte Ausgabe:

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

Antwort1

Richtige Idee – falsche Umsetzung

  1. Sie müssen das Feld speichernWertein einem Array, das durch das Feld indiziert istPosition. Also statt a[$i], machen Sie dasa[i]=$i

  2. dann musst du die Werte nachschlagennach Indexim Array. Also nicht $i="a"aber$i=a[i]

Abgesehen davon $i == "\."handelt es sich nicht um einen regulären Ausdruckstest, Sie müssen also nicht aussteigen.

$ 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

AlsEd Morton wies darauf hinkönnen Sie die Lösung verbessern, indem Sie die explizite Schleife durch die integrierte awk- splitFunktion ersetzen:

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

verwandte Informationen