¿Cómo definir el delimitador 'tab' con 'cut' en BASH?

215

Aquí hay un ejemplo de cómo usar cutpara dividir la entrada en campos usando un delimitador de espacio y obtener el segundo campo:

cut -f2 -d' '

¿Cómo se puede definir el delimitador como una pestaña, en lugar de un espacio?

Muhammad Hasan Khan
fuente
44
Tab es un delimitador predeterminado. corte -f 2
Melah

Respuestas:

301

Dos caminos:

Presione Ctrl+ Vy luego Tab.

cut -f2 -d'   ' infile

o escríbelo así:

cut -f2 -d$'\t' infile
Birei
fuente
10
$ '' - bash'ism, AFAIR
poige
8
Ninguno de los dos funciona en Windows (por ejemplo, Git Bash) obviamente. Use la respuesta de @ Mikel allí (el delimitador predeterminado es tab, simplemente omita el -dargumento).
Ahmed Fasih el
44
@poige, eso viene ksh93, no bash. Al menos, es compatible con ksh93, zsh, bash, mksh y FreeBSD sh ( podría llegar a la próxima reversión importante de la especificación estándar POSIX parash ).
Stéphane Chazelas
3
@micurb Eso es una cita de ANSI-C: gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
wisbucky
191

La pestaña es la predeterminada.

Vea la página del manual de corte .

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

Entonces deberías escribir

cut -f 2
Mikel
fuente
2
Oops no notó esa línea.
Muhammad Hasan Khan
44
Pero probablemente siempre sea más seguro mencionar dichos indicadores explícitamente, tanto para la legibilidad como para la portabilidad. Me imagino que algunas personas que diseñan un cutpara Windows no seguirían el estándar completo.
Willem Van Onsem
3
Esto debería aceptarse respuesta: código más simple, explicación más simple. ya lo logró: youtube.com/watch?v=dpNTHl7y45Y
neuronet
55
Esta respuesta ha cambiado mi vida
matheeeny
1
@WillemVanOnsem, si alguien escribe una versión de cutWindows y no sigue la especificación POSIX , no hay razón para suponer que cualquier script POSIX funcionará con ese sistema. Apéguese a las características especificadas por POSIX. No intente permitir implementaciones hipotéticas futuras no conformes; eso no es lo que significa "portabilidad".
Comodín
12
awk -F '\t' '{ print $2 }' inputfile

Esto extrae el segundo campo delimitado por tabulaciones de cada línea de entrada inputfile.

Iľja
fuente
10

Más genéricamente, sin requerir caracteres invisibles: se usa trpara convertir los delimitadores a un formato que se pueda especificar más fácilmente cut.

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

tr es una herramienta simple, pero poderosa, de coincidencia y reemplazo de personajes.

sin bar
fuente
1
Pero, ¿y si la entrada es abc(space)def(tab)ghi? Su respuesta cederá def, pero debería ceder ghi. Del mismo modo, si la entrada es ABC(tab)DEF(space)GHI, su respuesta rendirá DEF, pero debería rendir DEF(space)GHI.
G-Man
@ G-Man: El delimitador de espacio fue solo un ejemplo. Utilice el delimitador apropiado para sus datos, por ejemplo, una coma. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
nobar
... Pero sí, si el delimitador debe ser una pestaña, entonces mi enfoque no funcionará.
nobar