Awk hat mehrere sehr mächtige integrierte Variablen. Im Allgemeinen werden sie in zwei Typen unterteilt: - Der erste Typ sind Variablen, die geändert werden können, wie Feldtrennzeichen (FS) und Datensatztrennzeichen (RS) - Der zweite Typ kann für Datenverarbeitung oder Datenzusammenfassung verwendet werden, wie Datensatznummer (NR) und Feldnummer (NF). Dieser Artikel stellt vor:FS,OFS, RS, ORS, NR, NR, FNR
FS: Variable für das Eingabe-Feldtrennzeichen
FS(Feldtrennzeichen) Beim Lesen und Parsen jeder Zeile in der Eingabedatei wird sie standardmäßig durch Leerzeichen in Feldvariablen, $1, $2 usw., aufgeteilt.FSDie Variable wird verwendet, um das Feldtrennzeichensymbol für jeden Datensatz festzulegen.FSDabei kann es sich um eine beliebige Zeichenkette oder einen regulären Ausdruck handeln. Sie können FS auf die folgenden zwei Arten deklarieren:
Verwenden Sie-FBefehlszeilenoption
wenn man es als gewöhnliche Variablenzuweisung verwendet
语法:
$ awk -F 'FS' 'commands' inputfilename
或者
$ awk 'BEGIN{FS="FS";}'
FSEs kann ein beliebiges Zeichen oder ein regulärer Ausdruck sein.
FSEs kann mehrmals geändert werden, bleibt aber unverändert, bis es ausdrücklich geändert wird. Wenn Sie jedoch das Feldtrennzeichen ändern möchten, ist es am besten, es zu ändern, bevor Sie den Text lesen,FSdamit die Änderung für den Text wirksam wird, den Sie einlesen.
Unten folgt ein Beispiel für die Verwendung vonFS, um /etc/passwd mit:als Trennzeichen zu lesen
$ cat etc_passwd.awk
BEGIN{
FS=":";
print "Name\tUserID\tGroupID\tHomeDirectory";
}
{
print $1"\t"$3"\t"$4"\t"$6;
}
END {
print NR,"Records Processed";
}
Ausgabe:
$ awk -f etc_passwd.awk /etc/passwd Name UserID GroupID HomeDirectory gnats 41 41 /var/lib/gnats libuuid 100 101 /var/lib/libuuid syslog 101 102 /home/syslog hplip 103 7 /var/run/hplip avahi 105 111 /var/run/avahi-daemon saned 110 116 /home/saned pulse 111 117 /var/run/pulse gdm 112 119 /var/lib/gdm 8 Records Processed
OFS: Variable für das Ausgabefeldtrennzeichen
OFS(Output Field Separator) entsprichtFSFS bei der Ausgabe. Standardmäßig wird ein Leerzeichen als Ausgabetrennzeichen verwendet. Unten ist einOFS-Beispiel:
$ awk -F':' '{print $3,$4;}' /etc/passwd
41 41
100 101
101 102
103 7
105 111
110 116
111 117
112 119
Beachten Sie, dass das Komma in der print-Anweisung im Befehl bedeutet, dass ein Leerzeichen verwendet wird, um zwei Parameter zu verbinden, was der Standardwert von OFS ist. Daher kannOFSwie unten gezeigt zwischen Ausgabefeldern eingefügt werden:
$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd
41=41
100=101
101=102
103=7
105=111
110=116
111=117
112=11
RS: Datensatztrennzeichen
RS(Datensatztrennzeichen) definiert eine Datensatzzeile. Beim Lesen einer Datei wird standardmäßig eine Zeile als ein Datensatz behandelt. Das folgende Beispiel verwendet student.txt als Eingabedatei, wobei Datensätze durch zwei Leerzeilen getrennt sind und jedes Feld jedes Datensatzes durch einen Zeilenumbruch getrennt ist:
$ cat student.txt Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 65 Edwin 2537 78 67 45 Dayan 2415 30 47 20
Dann gibt das folgende Skript zwei Datensätze aus student.txt aus:
$ cat student.awk
BEGIN {
RS="\n\n";
FS="\n";
}
{
print $1,$2;
}
$ awk -f student.awk student.txt
Jones 2143
Gondrol 2321
RinRao 2122
Edwin 2537
Dayan 2415
In student.awk wird die detaillierte Information jedes Studenten als ein Datensatz behandelt, weil RS (Datensatztrennzeichen) auf zwei Zeilenumbrüche gesetzt ist. Und weilFS(Feldtrennzeichen) ein Zeilenumbruch ist, ist eine Zeile ein Feld.
ORS: Variable für das Ausgabedatensatztrennzeichen
ORS(Output Record Separator) ist, wie der Name schon sagt, für die Ausgabe äquivalent zuRSRS. Jeder Datensatz wird bei der Ausgabe durch ein Trennzeichen getrennt. Siehe folgendesORS-Beispiel:
$ awk 'BEGIN{ORS="=";} {print;}' student-marks
Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=
Im obigen Skript wird jeder Datensatz der Eingabedatei=getrennt. Hinweis: student-marks ist die obige Ausgabe.
NR: Variable für die Anzahl der Datensätze
NR(Anzahl der Datensätze) gibt die Gesamtzahl der bereits verarbeiteten Datensätze an, oder die Zeilennummer (nicht unbedingt die einer einzelnen Datei; es können mehrere sein). Im folgenden Beispiel repräsentiertNRdie Zeilennummer; im END-Teil,NRist die Gesamtzahl aller Datensätze in den Dateien.
$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks
Processing Record - 1
Processing Record - 2
Processing Record - 3
Processing Record - 4
Processing Record - 5
5 Students Records are processed
NF: Anzahl der Felder in einem Datensatz
NF(Anzahl der Felder) gibt die Anzahl der Felder in einem Datensatz an. Es ist sehr nützlich, um festzustellen, ob alle Felder in einem bestimmten Datensatz vorhanden sind. Betrachten wir die Datei student-mark wie folgt:
$ cat student-marks Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 Edwin 2537 78 67 45 Dayan 2415 30 47
Dann gibt das folgende Awk-Programm die Datensatznummer (NR) und die Anzahl der Felder in diesem Datensatz aus: Daher ist es sehr einfach, herauszufinden, welche Daten fehlen.
$ awk '{print NR,"->",NF}' student-marks
1 -> 5
2 -> 5
3 -> 4
4 -> 5
5 -> 4
FILENAME: Name der aktuellen Eingabedatei
FILENAMERepräsentiert den Namen der Datei, die gerade gelesen wird. AWK kann viele Dateien zur Verarbeitung annehmen und lesen. Siehe folgendes Beispiel:
$ awk '{print FILENAME}' student-marks
student-marks
student-marks
student-marks
student-marks
student-marks
Der Name wird für jeden Datensatz in der Eingabedatei ausgegeben.
FNR: Anzahl der Datensätze in der aktuellen Eingabedatei
Wenn awk mehrere Dateien liest,NRstellt es die Gesamtzahl der Datensätze über alle aktuell als Eingabe vorliegenden Dateien dar, währendFNRdie Anzahl der Datensätze in der aktuellen Datei ist. Wie im folgenden Beispiel:
$ awk '{print FILENAME, "FNR= ", FNR," NR= ", NR}' student-marks bookdetails
student-marks FNR= 1 NR= 1
student-marks FNR= 2 NR= 2
student-marks FNR= 3 NR= 3
student-marks FNR= 4 NR= 4
student-marks FNR= 5 NR= 5
bookdetails FNR= 1 NR= 6
bookdetails FNR= 2 NR= 7
bookdetails FNR= 3 NR= 8
bookdetails FNR= 4 NR= 9
bookdetails FNR= 5 NR= 10
Hinweis: bookdetails und student-marks haben denselben Inhalt, der als Beispiel dient. Man erkenntNRundFNRden Unterschied.
Oft werdenNRundFNRin Kombination verwendet, um zwei Dateien zu verarbeiten. Zum Beispiel gibt es zwei Dateien:
$ cat a.txt 李四|000002 张三|000001 王五|000003 赵六|000004 $ cat b.txt 000001|10 000001|20 000002|30 000002|15 000002|45 000003|40 000003|25 000004|60
Wenn Sie eine Zuordnung erstellen möchten, zum Beispiel Zhang San|000001|10
$ awk -F '|' 'NR == FNR{a[$2]=$1;} NR>FNR {print a[$1],"|", $0}' a.txt b.txt
张三 | 000001|10
张三 | 000001|20
李四 | 000002|30
李四 | 000002|15
李四 | 000002|45
王五 | 000003|40
王五 | 000003|25
赵六 | 000004|60
Englisches Original: http://www.thegeekstuff.com/2010/01/8-powerful-awk-built-in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/
Übersetzung: http://shomy.top/2016/05/05/trans-8-powerful-awk-built-in-variables/