Der Begriff „Feld“ wird oft mit Tools wie cut
in Verbindung gebracht und awk
. Ein Feld würde einer Datenspalte ähneln, wenn Sie die Daten nehmen und sie mit einem bestimmten Zeichen trennen. Typischerweise ist das dafür verwendete Zeichen ein Leerzeichen .
Wie bei den meisten Tools ist es jedoch konfigurierbar. Zum Beispiel:
- awk =
awk -F"," ...
- würde durch Kommas getrennt (d.h. , ). - Schnitt =
cut -d"," ...
- würde durch Kommas getrennt (d.h. , ).
Beispiele
Dieses erste zeigt, wie awk
wird automatisch auf Leerzeichen aufgeteilt.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Dieses zeigt, wie cut
wird auch bei Leerzeichen geteilt.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Hier haben wir eine CSV-Liste mit Spaltendaten, die wir verwenden cut
um die Spalten 1 &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 Trennungszeichen. Hier geht es um Tabs zusammen mit Leerzeichen wo sie gleichzeitig gemischt werden:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
Was ist mit dem Schalter -s zum Ausschneiden?
In Bezug auf diesen Schalter sagt er einfach cut
keine Zeilen zu drucken, die das über -d
angegebene Trennzeichen nicht enthalten wechseln.
Beispiel
Angenommen, wir hatten diese Datei.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
HINWEIS: Es gibt Leerzeichen und Tabulatoren in der 2. Zeichenfolge oben.
Wenn wir nun diese Strings mit cut
verarbeiten mit und ohne -s
Schalter:
$ 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 2. Beispiel sieht man, dass die -s
switch hat alle Zeichenfolgen aus der Ausgabe weggelassen, die das Trennzeichen Leerzeichen nicht enthalten .
Ein Feld nach POSIX ist ein beliebiger Teil einer Zeile, die durch eines der Zeichen in IFS
begrenzt ist , das "Eingabefeld-Trennzeichen (oder interner Feldtrenner )." Der Standardwert dafür ist Leerzeichen, gefolgt von einem horizontalen Tabulator, gefolgt von einem Zeilenumbruch. Mit Bash können Sie printf '%q\n' "$IFS"
ausführen um seinen Wert zu sehen.
Dies hängt vom jeweiligen Dienstprogramm ab, außer für cut
, ein "Feld" beginnt am Anfang einer Textzeile und umfasst alles bis zum ersten Tabulator. Das zweite Feld verläuft von dem Zeichen nach dem ersten Tabulator bis zum nächsten Tabulator. Und so weiter für dritte, vierte, ... Alles zwischen Tabulatoren oder zwischen Zeilenanfang und Tabulator oder zwischen Tabulator und Zeilenende.
Es sei denn, Sie geben mit der Option „-d“ ein Feldtrennzeichen an:cut -d: -f2
würde Ihnen alles zwischen dem ersten und dem zweiten Doppelpunkt (':') geben.
Andere Dienstprogramme haben andere Definitionen, aber ein Tabulatorzeichen ist üblich. awk
ist ein guter Fallback, wenn cut
ist zu streng, wie awk
teilt Felder basierend auf einem oder mehreren Leerzeichen. Das ist in vielen Situationen etwas natürlicher, aber Sie müssen ein wenig Syntax beherrschen. Zum Drucken des zweiten Feldes gemäß awk
:
awk '{print $2}'
sort
ist derjenige, der mich austrickst. Mein aktueller sort
Manpage sagt so etwas wie "Übergang von Nicht-Leerzeichen zu Leerzeichen" für ein Feldtrennzeichen. Aus irgendeinem Grund braucht es ein paar Versuche, um sort
zu bekommen Felder richtig definiert. join
verwendet anscheinend "durch Leerzeichen getrennte" Felder, was awk
ist vorgibt standardmäßig zu tun.
Die Moral der Geschichte ist, vorsichtig zu sein und zu experimentieren, wenn man es nicht weiß.