
Beispielsweise cut
kann der Befehl den Parameter -f annehmen, der gemäßman
Wählen Sie nur diese Felder aus. Drucken Sie auch alle Zeilen, die kein Trennzeichen enthalten, sofern nicht die Option -s angegeben ist.
Was ist in diesem Zusammenhang ein Feld?
Antwort1
Der Begriff „Feld“ wird oft mit Tools wie cut
und in Verbindung gebracht awk
. Ein Feld entspricht einer Datenspalte, wenn Sie die Daten mit einem bestimmten Zeichen trennen. Normalerweise wird hierfür ein verwendet Space.
Wie die meisten Tools ist es jedoch konfigurierbar. Beispiel:
- awk =
awk -F"," ...
- würde durch Kommas trennen (also ,). - cut =
cut -d"," ...
- würde durch Kommas trennen (also ,).
Beispiele
Das erste zeigt, wie awk
automatisch nach Leerzeichen aufgeteilt wird.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Dieses zeigt cut
auch, wie die Aufteilung in Leerzeichen erfolgt.
$ 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 und 4 zurückzugeben.
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Auch Awk kann dies:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk kann auch etwas besser mit einer Vielzahl von Trennzeichen umgehen. Hier geht es darum, sie gleichzeitig zu verarbeiten Tabsund zu verwenden:Spaces
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
Was ist mit dem Schalter -s zum Ausschneiden?
Dieser Schalter weist Sie lediglich an, cut
keine Zeilen zu drucken, die nicht das über den Schalter angegebene Trennzeichen enthalten -d
.
Beispiel
Angenommen, wir hätten diese Datei.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
NOTIZ:In der zweiten Zeichenfolge oben befinden sich Leerzeichen und Tabulatoren.
cut
Wenn wir diese Zeichenfolgen nun mit und ohne Schalter verarbeiten -s
:
$ 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 alle Zeichenfolgen aus der Ausgabe ausgelassen hat, die nicht das Trennzeichen enthalten Space.
Antwort2
Ein Feld ist gemäß POSIX jeder Teil einer Zeile, der durch eines der Zeichen inIFS
, Die "Eingabefeld-Trennzeichen(oderinterner Feldtrenner)." Der Standardwert hierfür ist ein Leerzeichen, gefolgt von einem horizontalen Tabulator, gefolgt von einer neuen Zeile. Mit Bash können Sie printf '%q\n' "$IFS"
den Wert anzeigen, indem Sie ihn ausführen.
Antwort3
Dies hängt vom jeweiligen Dienstprogramm ab, aber für cut
beginnt ein „Feld“ am Anfang einer Textzeile und umfasst alles bis zum ersten Tabulator. Das zweite Feld reicht vom Zeichen nach dem ersten Tabulator bis zum nächsten Tabulator. Und so weiter für das dritte, vierte, … Alles zwischen Tabulatoren oder zwischen Zeilenanfang und Tabulator oder zwischen Tabulator und Zeilenende.
Sofern Sie mit der Option „-d“ kein Feldtrennzeichen angeben, cut -d: -f2
erhalten Sie alles zwischen dem ersten und zweiten Doppelpunkt (:).
Andere Dienstprogramme haben andere Definitionen, aber ein Tabulatorzeichen ist üblich. awk
ist ein guter Ersatz, wenn cut
zu streng ist, da awk
Felder basierend auf einem oder mehreren Leerzeichen unterteilt werden. Das ist in vielen Situationen etwas natürlicher, aber Sie müssen ein bisschen Syntax kennen. So drucken Sie das zweite Feld gemäß awk
:
awk '{print $2}'
sort
ist das, was mich täuscht. Auf meiner aktuellen sort
Manpage steht so etwas wie „Übergang von nicht leer zu leer“ für einen Feldtrenner. Aus irgendeinem Grund braucht es mehrere Versuche, um sort
die Felder richtig zu definieren. join
verwendet anscheinend „durch Leerzeichen getrennte“ Felder, was awk
angeblich standardmäßig der Fall ist.
Die Moral der Geschichte ist: Seien Sie vorsichtig und experimentieren Sie, wenn Sie es nicht wissen.
Antwort4
Wenn Sie cut
den Befehl verwenden, benötigt er zwei Hauptargumente
-d: steht für Trennzeichen
-f: steht für das aus der Eingabedatei auszuschneidende Feld
Ex. cut - d "|" - f1, 2 input_filename
Hier output
würden sie durch das Trennzeichen "|" getrennt und es würden nur 2 Felder aus der Eingabedatei ausgeschnitten.
Wenn Ihre Datei die folgenden Zeilen enthält
Alex|120000|Admin|1999
Dann werden 2 Felder geschnitten, die
Alex|120000