Antworten:
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 -F"," ...
- würde durch Kommas (dh ,) getrennt.cut -d"," ...
- würde durch Kommas trennen ,.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.
In Bezug auf diesen Schalter wird lediglich empfohlen cut
, keine Zeilen zu drucken, die nicht das über den -d
Schalter angegebene Trennzeichen enthalten .
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.
Ein Feld nach POSIX ist ein beliebiger Teil einer Zeile, der durch ein beliebiges Zeichen im FeldIFS
" Eingabefeldtrennzeichen (oder internes Feldtrennzeichen ) " begrenzt wird. Der Standardwert hierfür ist Leerzeichen, gefolgt von einem horizontalen Tabulator, gefolgt von einer neuen Zeile . Mit Bash können Sie laufen printf '%q\n' "$IFS"
, um seinen Wert zu sehen.
cut
welchen.
cut -d "$IFS"
ein Fehler auf, wohingegen es awk -F"[ \t\n]"
wie erwartet funktioniert
Dies 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, wenn cut
es zu streng ist, da awk
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
:
awk '{print $2}'
sort
ist derjenige, der mich betrügt. Auf meiner aktuellen sort
Manpage steht für einen Feldtrenner so etwas wie "Übergang von nicht leer zu leer". Aus irgendeinem Grund sind einige Versuche erforderlich, um die sort
Felder richtig zu definieren. join
Anscheinend werden "durch Leerzeichen abgegrenzte" Felder verwendet, was angeblich standardmäßig der Fall ist awk
.
Die Moral der Geschichte ist, vorsichtig zu sein und zu experimentieren, wenn Sie es nicht wissen.
Der Begriff "Feld" bezieht sich nicht auf Linux im Allgemeinen, sondern auf bestimmte Programme. So cut
verwendet eine andere Art von Feld als sort
.
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
:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Wenn Sie den cut
Befehl verwenden, werden zwei Hauptargumente benötigt
-d: welche für Begrenzer stehen
-f: steht für ein Feld, das aus der Eingabedatei ausgeschnitten werden soll
Ex. cut - d "|" - f1, 2 input_filename
Hier wird das output
Trennzeichen "|" und es werden nur 2 Felder aus der Eingabedatei ausgeschnitten
Wenn Sie folgende Zeilen in Ihrer Datei haben
Alex|120000|Admin|1999
Dann schneidet es 2 Felder, die sind
Alex|120000
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}'
oder ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
sind sehr einfach, aber es wäre schwer damit umzugehen cut
.
Ich stimme früheren Postern zu, dass Felder / Eingaben sort
schwer herauszufinden sind! Felder in join
scheinen genauso zu funktionieren wie in cut
, obwohl join
Optionen leicht verwechselt werden können.
echo '$IFS' | cat -vet
auf, um zu sehen, wie der Standardwert in der Abbildung aussiehtshell
.