Der Begriff "Feld" wird häufig mit Werkzeugen wie cut
und assoziiert awk
. Ein Feld ähnelt einer Datenspalte, wenn Sie die Daten mit einem bestimmten Zeichen trennen. In der Regel wird hierfür ein Zeichen verwendet Space.
Wie bei den meisten Tools ist es jedoch konfigurierbar. Beispielsweise:
- awk =
awk -F"," ...
- würde durch Kommas (dh ,) getrennt.
- cut =
cut -d"," ...
- würde durch Kommas trennen ,.
Beispiele
Diese erste zeigt, wie awk
automatisch auf Leerzeichen aufgeteilt wird.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Dieser zeigt, wie cut
auch Leerzeichen aufgeteilt werden.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Hier haben wir eine CSV-Liste von Spaltendaten, die wir verwenden cut
, um die Spalten 1 und 4 zurückzugeben.
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Awk kann das auch:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk ist auch etwas geschickter im Umgang mit einer Vielzahl von Trennzeichen. Hier ist es den Umgang mit Tabszusammen mit , Spaceswo sie sind zugleich inter gemischt:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
Was ist mit dem Schalter -s zu schneiden?
In Bezug auf diesen Schalter wird lediglich empfohlen cut
, keine Zeilen zu drucken, die nicht das über den -d
Schalter angegebene Trennzeichen enthalten .
Beispiel
Sagen wir, wir hätten diese Datei.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
HINWEIS: Die zweite Zeichenfolge enthält Leerzeichen und Tabulatoren.
Wenn wir nun diese Zeichenfolgen cut
mit und ohne -s
Schalter verarbeiten:
$ cut -d" " -f1-6 sample.txt
This is a space string.
This is a space
Thisstringcontainsneither.
$ cut -d" " -f1-6 -s sample.txt
This is a space string.
This is a space
Im zweiten Beispiel können Sie sehen, dass der -s
Schalter Zeichenfolgen aus der Ausgabe ausgelassen hat, die das Trennzeichen nicht enthalten Space.
echo '$IFS' | cat -vet
auf, um zu sehen, wie der Standardwert in der Abbildung aussiehtshell
.cut
welchen.cut -d "$IFS"
ein Fehler auf, wohingegen esawk -F"[ \t\n]"
wie erwartet funktioniertDies hängt vom jeweiligen Dienstprogramm ab, aber
cut
ein "Feld" beginnt am Anfang einer Textzeile und enthält alles bis zur ersten Registerkarte. Das zweite Feld reicht vom Zeichen nach dem ersten Tab bis zum nächsten Tab. Und so weiter für den dritten, vierten, ... Alles zwischen Tabulatoren oder zwischen Zeilenanfang und -ende oder zwischen Tabulatoren und Zeilenende.Wenn Sie kein Feldtrennzeichen mit der Option "-d" angeben
cut -d: -f2
, wird alles zwischen dem ersten und zweiten Doppelpunkt (':') angezeigt.Andere Dienstprogramme haben andere Definitionen, ein Tabulatorzeichen ist jedoch üblich.
awk
Dies ist ein guter Rückgriff, wenncut
es zu streng ist, daawk
Felder basierend auf einem oder mehreren Leerzeichen unterteilt werden. Das ist in vielen Situationen ein bisschen natürlicher, aber Sie müssen ein bisschen Syntax kennen. So drucken Sie das zweite Feld gemäßawk
:sort
ist derjenige, der mich betrügt. Auf meiner aktuellensort
Manpage steht für einen Feldtrenner so etwas wie "Übergang von nicht leer zu leer". Aus irgendeinem Grund sind einige Versuche erforderlich, um diesort
Felder richtig zu definieren.join
Anscheinend werden "durch Leerzeichen abgegrenzte" Felder verwendet, was angeblich standardmäßig der Fall istawk
.Die Moral der Geschichte ist, vorsichtig zu sein und zu experimentieren, wenn Sie es nicht wissen.
quelle
Der Begriff "Feld" bezieht sich nicht auf Linux im Allgemeinen, sondern auf bestimmte Programme. So
cut
verwendet eine andere Art von Feld alssort
.Mit
cut
definieren Sie selbst, was ein Feld ist, indem Sie einen Feldbegrenzer mit der Option -d angeben, der die Felder in jeder Zeile trennt.Wenn Ihre Daten in den Zeilen durch Doppelpunkte getrennt sind, können Sie die Felder (oder Spalten) 2, 3 und 6 folgendermaßen kombinieren
-d
und abrufen-f
:quelle
Wenn Sie den
cut
Befehl verwenden, werden zwei Hauptargumente benötigtHier wird das
output
Trennzeichen "|" und es werden nur 2 Felder aus der Eingabedatei ausgeschnittenWenn Sie folgende Zeilen in Ihrer Datei haben
Dann schneidet es 2 Felder, die sind
quelle
cut
eignet sich hervorragend für einfache Fälle, in denen das Trennzeichen ein einzelnes Zeichen ist und Sie eine Teilmenge der Eingabefelder in derselben Reihenfolge ausgeben möchten (auch wenn ich angegeben habe-f3,2,1
, verhält es sich genauso wie-f1,2,3
).awk
Einzeiler sind viel flexibler, z. B. wenn das Trennzeichen für Eingabefelder ein Leerzeichen sein kann (awk
Standardeinstellung) oder wenn Sie Felder in einer anderen Reihenfolge oder mit einem bestimmten Format ausgeben möchten.Zum Beispiel
wc -l myfile | awk '{print $1}'
oderls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
sind sehr einfach, aber es wäre schwer damit umzugehencut
.Ich stimme früheren Postern zu, dass Felder / Eingaben
sort
schwer herauszufinden sind! Felder injoin
scheinen genauso zu funktionieren wie incut
, obwohljoin
Optionen leicht verwechselt werden können.quelle