awk und sed hängen das Zeilenende jeder zugehörigen Zeile an

awk und sed hängen das Zeilenende jeder zugehörigen Zeile an

Ich möchte einige Zeilenmanipulationen durchführen, stecke aber bei der zeilenweisen Verarbeitung fest. Meine Datei sieht folgendermaßen aus:

10.10.10.10 ABtest
10.10.10.11 ABprod

Ich möchte an jede Zeile einen String anhängen, der dem String am Zeilenende entspricht.

Mein Ansatz besteht darin, awk zum Testen des Strings ABtestam Zeilenende zu verwenden und dann mit sed von ABtestin zu konvertieren test. Danach möchte ich die Ausgabe an jede zugehörige Zeile anhängen.

Ich möchte folgende Ausgabe haben:

10.10.10.10 ABtest test
10.10.10.11 ABprod prod

Antwort1

Es besteht keine Notwendigkeit für beide, sedund awkSie können mit einem Tool arbeiten. Der Code, der Ihr Ziel erreicht, awkkönnte sein

awk ' 
/AB/ { 
        printf $0
        gsub("^AB", "", $2)
        printf " %s\n", $2
     }
' <<EOT
10.10.10.10 ABtest
10.10.10.11 ABprod
EOT

/<expression>/sucht nach regulären Ausdrücken und der {<code>}Teil sagt awk, was mit diesem Datensatz zu tun ist. In diesem speziellen Fall gsubersetzt die Funktion alle Vorkommen von „AB“ in der zweiten Spalte – wenn Sie nur das erste Vorkommen ersetzen möchten, verwenden Sie, sub()aber in Bezug auf den regulären Ausdruck können Sie hier vermutlich das eine oder das andere mit demselben Ergebnis verwenden – und das Ergebnis wird anschließend gedruckt.

Aus Ihrer Frage geht nicht hervor, ob zwischen den zu bearbeitenden Zeilen Zeilen vorhanden sind, die unverändert gedruckt werden sollen. Wenn dies der Fall ist, müssen Sie nach dem Match-and-Edit-Vorgang wie folgt zum nächsten Datensatz springen:

awk '
/AB/ { printf $0; gsub("^AB", "", $2); printf " $2\n"; next; }
{ print $0 }
' <<EOT
10.10.10.10 ABtest
10.10.10.11 ABprod
testtesttets
EOT

Vielleicht sollten Sie einen noch spezifischeren Test erstellen, indem Sie verwenden if. Ich empfehle Ihnen dringend, einen Blick auf einige Awk-Ressourcen zu werfen (HieroderHierZum Beispiel)

verwandte Informationen