Angenommen, Sie möchten Zeile 4 durch den Text "different" ersetzen. Sie können AWK wie folgt verwenden:
awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt
AWK betrachtet die Eingabe als "Datensätze", die in "Felder" unterteilt sind. Standardmäßig ist eine Zeile ein Datensatz. NR
ist die Anzahl der gesehenen Datensätze. $0
stellt den aktuellen vollständigen Datensatz dar (während dies $1
das erste Feld aus dem Datensatz usw. ist; standardmäßig sind die Felder Wörter aus der Zeile).
Wenn die aktuelle Zeilennummer 4 ist, drucken Sie die Zeichenfolge "anders", andernfalls drucken Sie die Zeile unverändert.
In AWK wird der in eingeschlossene Programmcode { }
einmal in jedem Eingabedatensatz ausgeführt.
Sie müssen das AWK-Programm in einfache Anführungszeichen setzen, damit die Shell nicht versucht, Dinge wie das zu interpretieren $0
.
EDIT: Ein kürzeres und eleganteres AWK-Programm von @chepner in den Kommentaren unten:
awk 'NR==4 {$0="different"} { print }' input_file.txt
Ersetzen Sie nur für Datensatz (dh Zeile) Nummer 4 den gesamten Datensatz durch die Zeichenfolge "different". Drucken Sie dann für jeden Eingabedatensatz den Datensatz.
Offensichtlich sind meine AWK-Fähigkeiten verrostet! Vielen Dank, @chepner.
EDIT: und siehe auch eine noch kürzere Version von @Dennis Williamson:
awk 'NR==4 {$0="different"} 1' input_file.txt
Wie dies funktioniert, wird in den Kommentaren erklärt: Der 1
Wert wird immer als wahr ausgewertet, sodass der zugehörige Codeblock immer ausgeführt wird. Es ist jedoch kein Codeblock zugeordnet, was bedeutet, dass AWK standardmäßig nur die gesamte Zeile druckt. AWK wurde entwickelt, um knappe Programme wie dieses zu ermöglichen.