
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
Sie müssen das Feld speichernWertein einem Array, das durch das Feld indiziert istPosition. Also statt
a[$i]
, machen Sie dasa[i]=$i
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- split
Funktion ersetzen:
awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'