Was ist ein "Feld" für den Befehl "Ausschneiden"?

16

Zum Beispiel kann der cutBefehl einen Parameter -f annehmen, der entsprechendman

Wählen Sie nur diese Felder aus. Drucken Sie auch alle Zeilen aus, die kein Trennzeichen enthalten, es sei denn, die Option -s ist angegeben

Was ist in diesem Zusammenhang ein Feld?

luca590
quelle

Antworten:

19

Der Begriff "Feld" wird häufig mit Werkzeugen wie cutund 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 awkautomatisch auf Leerzeichen aufgeteilt wird.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Dieser zeigt, wie cutauch 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 -dSchalter 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 cutmit und ohne -sSchalter 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 -sSchalter Zeichenfolgen aus der Ausgabe ausgelassen hat, die das Trennzeichen nicht enthalten Space.

slm
quelle
8

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.

l0b0
quelle
Klicken Sie echo '$IFS' | cat -vet auf, um zu sehen, wie der Standardwert in der Abbildung aussieht shell.
C0deDaedalus
1
IFS wird von der Shell für die meisten Zwecke (nicht für alle) verwendet, jedoch nicht von anderen Programmen und insbesondere nicht von cutwelchen.
Dave_thompson_085
Im Gegensatz zu awk unterstützt cut auch immer nur ein Trennzeichen, daher tritt cut -d "$IFS"ein Fehler auf, wohingegen es awk -F"[ \t\n]"wie erwartet funktioniert
JGurtz,
2

Dies hängt vom jeweiligen Dienstprogramm ab, aber cutein "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. awkDies ist ein guter Rückgriff, wenn cutes zu streng ist, da awkFelder 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}'

sortist derjenige, der mich betrügt. Auf meiner aktuellen sortManpage steht für einen Feldtrenner so etwas wie "Übergang von nicht leer zu leer". Aus irgendeinem Grund sind einige Versuche erforderlich, um die sortFelder richtig zu definieren. joinAnscheinend 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.

Bruce Ediger
quelle
2

Der Begriff "Feld" bezieht sich nicht auf Linux im Allgemeinen, sondern auf bestimmte Programme. So cutverwendet eine andere Art von Feld als sort.

Mit cutdefinieren 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 -dund abrufen -f:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Volker Siegel
quelle
1

Wenn Sie den cutBefehl 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 outputTrennzeichen "|" 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
Schah Schatz
quelle
Ihr Beispiel ist aufgrund falscher Leerzeichen völlig kaputt, und selbst wenn dies korrekt ist, trägt dies nichts zu den Antworten bei, die vor 4 Jahren gegeben wurden.
Dave_thompson_085
0

cuteignet 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).

awkEinzeiler sind viel flexibler, z. B. wenn das Trennzeichen für Eingabefelder ein Leerzeichen sein kann ( awkStandardeinstellung) 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 sortschwer herauszufinden sind! Felder in joinscheinen genauso zu funktionieren wie in cut, obwohl joinOptionen leicht verwechselt werden können.

Laurence Renshaw
quelle