Die Frage von Ignorant hier: Der Teil / 1 / soll awk anweisen, nur Zeilen (oder genauer gesagt Datensätze) zu verarbeiten, die die Nummer 1 enthalten, oder?
Rantsh
3
Die Syntax von @rantsh Awk sieht aus wie (pattern){action}. Wenn pattern(meistens eine bedingte Aussage) wahr ist , actionwird ausgeführt. Wenn patternnicht verfügbar, trueist impliziert. Hier patternist /1/der Status, 1mit dem der Regex im aktuellen Datensatz$0
übereinstimmt
62
Wenn Sie es programmgesteuert ausführen möchten, können Sie die FSVariable verwenden:
Beachten Sie, dass wenn Sie es in der Hauptschleife anstatt in der Schleife ändern BEGIN, es für die nächste eingelesene Zeile wirksam wird, da die aktuelle Zeile bereits geteilt wurde.
Welches ist der bevorzugte Weg? Ich gehe davon aus, dass das letzte Beispiel mit der BEGINAnweisung am korrektesten ist (in Übereinstimmung mit der Gesamtsyntax awk).
1
@ Randomware alle von ihnen sind in Ordnung. Ich neige dazu, zu verwenden, BEGINwenn ich eine Datei verwende, um das Ganze zu speichern, während es -Fbei Einzeilern nützlich ist.
fedorqui 'SO hör auf,'
1
Es muss gesagt werden, dass es subtile Unterschiede zwischen dem dritten Fall und allen anderen gibt. Beispiel: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileundawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Sie können auch einen regulären Ausdruck als Feldtrennzeichen verwenden. Im Folgenden wird "Balken" gedruckt, indem ein regulärer Ausdruck verwendet wird, um die Zahl "10" als Trennzeichen festzulegen.
Keine Notwendigkeit, so viel zu schreiben. Fügen Sie einfach Ihr gewünschtes Feldtrennzeichen mit der Option -F in den Befehl awk ein und die Spaltennummer, die Sie drucken möchten, getrennt nach Ihrem genannten Feldtrennzeichen.
AWK arbeitet als Text - Interpreter , die linewise für das gesamte Dokument geht und das geht feld für jede Zeile so 1, $ 2 $ .. $ n sind Verweise auf die Felder jeder Zeile ($ 1 das erste Feld, $ 2 ist das zweite Feld und so weiter ...). Sie können ein Feldtrennzeichen definieren, indem Sie den Schalter "-F" unter der Befehlszeile oder in zwei Klammern mit "FS = ..." verwenden. Betrachten Sie nun die Antwort von "JUERGEN":
echo "1: "| awk -F ":"'/1/ {print $1}'
Über den Feldgrenzen werden durch ":" gesetzt, so dass wir zwei Felder $ 1 haben, die "1" sind, und $ 2, die der leere Raum ist. Danach folgt der reguläre Ausdruck "/ 1 /", der den Filter anweist, nur das erste Feld auszugeben wenn der Dolmetscher auf eine Zeile stößt, die einen solchen Ausdruck enthält (ich meine 1); Die Ausgabe des Befehls "echo" ist eine Zeile, die "1" enthält, damit der Filter funktioniert ...
Im folgenden Beispiel:
echo "1: "| awk '/1/ -F ":" {print $1}'
Die Syntax ist chaotisch und der Interpreter hat den Teil F ":" ignoriert.
und wechselt zum Standardfeldteiler, der der leere Raum ist, wodurch "1:" als erstes Feld ausgegeben wird und es kein zweites Feld gibt!
Die Antwort von JUERGEN enthält die gute Syntax ...
(pattern){action}
. Wennpattern
(meistens eine bedingte Aussage) wahr ist ,action
wird ausgeführt. Wennpattern
nicht verfügbar,true
ist impliziert. Hierpattern
ist/1/
der Status,1
mit dem der Regex im aktuellen Datensatz$0
Wenn Sie es programmgesteuert ausführen möchten, können Sie die
FS
Variable verwenden:Beachten Sie, dass wenn Sie es in der Hauptschleife anstatt in der Schleife ändern
BEGIN
, es für die nächste eingelesene Zeile wirksam wird, da die aktuelle Zeile bereits geteilt wurde.quelle
Sie haben mehrere Möglichkeiten,
:
als Trennzeichen festzulegen:Alle von ihnen sind gleichwertig und werden
1
für eine Beispieleingabe "1: 2: 3" zurückgegeben:quelle
BEGIN
Anweisung am korrektesten ist (in Übereinstimmung mit der Gesamtsyntaxawk
).BEGIN
wenn ich eine Datei verwende, um das Ganze zu speichern, während es-F
bei Einzeilern nützlich ist.awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
undawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
-F
ist ein Argument fürawk
sich:quelle
Sie können auch einen regulären Ausdruck als Feldtrennzeichen verwenden. Im Folgenden wird "Balken" gedruckt, indem ein regulärer Ausdruck verwendet wird, um die Zahl "10" als Trennzeichen festzulegen.
quelle
Keine Notwendigkeit, so viel zu schreiben. Fügen Sie einfach Ihr gewünschtes Feldtrennzeichen mit der Option -F in den Befehl awk ein und die Spaltennummer, die Sie drucken möchten, getrennt nach Ihrem genannten Feldtrennzeichen.
quelle
AWK arbeitet als Text - Interpreter , die linewise für das gesamte Dokument geht und das geht feld für jede Zeile so 1, $ 2 $ .. $ n sind Verweise auf die Felder jeder Zeile ($ 1 das erste Feld, $ 2 ist das zweite Feld und so weiter ...). Sie können ein Feldtrennzeichen definieren, indem Sie den Schalter "-F" unter der Befehlszeile oder in zwei Klammern mit "FS = ..." verwenden. Betrachten Sie nun die Antwort von "JUERGEN":
Über den Feldgrenzen werden durch ":" gesetzt, so dass wir zwei Felder $ 1 haben, die "1" sind, und $ 2, die der leere Raum ist. Danach folgt der reguläre Ausdruck "/ 1 /", der den Filter anweist, nur das erste Feld auszugeben wenn der Dolmetscher auf eine Zeile stößt, die einen solchen Ausdruck enthält (ich meine 1); Die Ausgabe des Befehls "echo" ist eine Zeile, die "1" enthält, damit der Filter funktioniert ...
Im folgenden Beispiel:
Die Syntax ist chaotisch und der Interpreter hat den Teil F ":" ignoriert. und wechselt zum Standardfeldteiler, der der leere Raum ist, wodurch "1:" als erstes Feld ausgegeben wird und es kein zweites Feld gibt!
Die Antwort von JUERGEN enthält die gute Syntax ...
quelle
Oder Sie können verwenden:
Das ist wirklich eine lustige Gleichung.
quelle
/1/
bedeuten?