Wie kann man in BASH das Trennzeichen 'tab' mit 'cut' definieren?

215

Hier ist ein Beispiel für das Aufteilen cutvon Eingaben in Felder mithilfe eines Leerzeichenbegrenzers und das Abrufen des zweiten Felds:

cut -f2 -d' '

Wie kann der Begrenzer als Tabulator anstatt als Leerzeichen definiert werden?

Muhammad Hasan Khan
quelle
4
Tab ist ein Standardtrennzeichen. cut -f 2
Melah

Antworten:

301

Zwei Wege:

Drücken Sie Ctrl+ Vund dann Tab.

cut -f2 -d'   ' infile

oder schreibe es so:

cut -f2 -d$'\t' infile
Birei
quelle
10
$ '' - bash'ism, AFAIR
poige
8
Beides funktioniert offensichtlich nicht unter Windows (zB Git Bash). Verwenden Sie dort die Antwort von @ Mikel (Standardtrennzeichen ist tab, -dArgument einfach weglassen ).
Ahmed Fasih
4
@poige, das kommt ksh93nicht von bash. Das ist von ksh93 unterstützt, zsh, bash, mksh und FreeBSD sh mindestens ( es könnte es machen auf die nächste Haupt Reversion der POSIX - Standard - Spezifikation fürsh ).
Stéphane Chazelas
3
@micurb Das ist ANSI-C Zitat: gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
wisbucky
191

Tab ist die Standardeinstellung.

Siehe die Manpage cut .

-d delim
         Use delim as the field delimiter character instead of the tab
         character.

Also solltest du einfach schreiben

cut -f 2
Mikel
quelle
2
Ups, diese Zeile ist mir nicht aufgefallen.
Muhammad Hasan Khan
4
Es ist jedoch wahrscheinlich immer sicherer, solche Flags explizit zu erwähnen, sowohl aus Gründen der Lesbarkeit als auch der Portabilität. Ich kann mir vorstellen, dass einige Leute, die ein cutfür Windows konzipieren, nicht dem vollständigen Standard folgen würden.
Willem Van Onsem
3
Dies sollte als Antwort akzeptiert werden: einfachster Code, einfachste Erklärung.
Du hast
5
Diese Antwort hat mein Leben verändert
matheeeny
1
@WillemVanOnsem: Wenn jemand eine Version von cutfür Windows schreibt und die POSIX-Spezifikation dafür nicht befolgt, gibt es keinen Grund anzunehmen, dass ein POSIX-Skript mit diesem System funktioniert. Halten Sie sich an die POSIX-spezifischen Funktionen. Versuchen Sie nicht, hypothetische zukünftige nicht konforme Implementierungen zuzulassen. Das ist nicht das, was "Portabilität" bedeutet.
Wildcard
12
awk -F '\t' '{ print $2 }' inputfile

Dies extrahiert das zweite durch Tabulatoren getrennte Feld jeder Eingabezeile aus inputfile.

Iľja
quelle
10

Allgemeiner, ohne dass unsichtbare Zeichen erforderlich sind: Verwenden Sie trdiese Option , um die Begrenzer in ein Format zu konvertieren, in dem die Angabe einfacher ist cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b

tr ist ein einfaches, aber leistungsfähiges Tool zum Abgleichen und Ersetzen von Zeichen.

kein Balken
quelle
1
Aber was ist, wenn der Eingang ist abc(space)def(tab)ghi? Ihre Antwort wird nachgeben def, aber sie sollte nachgeben ghi. In ähnlicher Weise wird ABC(tab)DEF(space)GHIIhre Antwort nachgeben , wenn die Eingabe lautet DEF, aber sie sollte nachgeben DEF(space)GHI.
G-Man
@ G-Man: Der Raumbegrenzer war nur ein Beispiel. Verwenden Sie das für Ihre Daten geeignete Trennzeichen, beispielsweise ein Komma. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
26.
... Aber ja, wenn das Trennzeichen ein Tabulator sein muss, dann funktioniert mein Ansatz nicht.
Am