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/