¿Cómo puedo usar la columna para delimitar las pestañas y no los espacios?

59

Me gustaría usar el columncomando Unix para formatear un texto. Tengo campos delimitados por pestañas, pero dentro de cada campo también hay espacios. columndelimita en el espacio en blanco (pestañas y espacios). ¿Cómo puedo hacer que la columna solo use pestañas como delimitador?

Intenté especificar la pestaña como delimitador usando:

cat myfile | column -t -s"\t"
Tortuga
fuente

Respuestas:

82
column -t -s '\t'

separaría columnas \y tcaracteres.

column -s \tes lo mismo column -s t, ya que la barra invertida es interpretada como un operador de comillas por el shell.

Aquí desea pasar un carácter TAB real a la columna. Con ksh93, zsh, bash, mksh, busybox sh o FreeBSD sh:

column -ts $'\t'

O ingrese un carácter de tabulación real escribiendo Ctrl-V Taben el indicador de comandos de shell (entre comillas o precedido por una barra diagonal inversa ya que el carácter de tabulación es un separador de tokens en la sintaxis de shell como espacio), o use "$(printf '\t')"(esas comillas dobles necesarias para desactivar el split + glob operador ya que el carácter de tabulación también está en el valor predeterminado de $IFS).

Stéphane Chazelas
fuente
3
Tuve que hacer column -t -s $'\t'como bash parecía pensar que '\t'significaba ambos \ y t, pero $'\t'significa una pestaña literal. Bash apesta
ThorSummoner
Si necesita conformidad con POSIX (señor, ayúdeme), vea mi respuesta, que se basa en gran medida en esta fantástica respuesta.
Nick Bull
Esta solución funcionó para mí: la $'\t'pestaña make es el delimitador. Pero estoy bastante seguro de que debo awk -F "\t"usar una pestaña como delimitador para awk. ¿Por qué funciona eso y no aquí para la columna?
Mike
3

Usé lo siguiente (solo funciona si su texto no contiene |):

cat myfile | tr '\t' '|' | column -t -s '|'

Esto simplemente reemplaza las pestañas con tuberías, luego usa columnas con tuberías como delimitadores.

(Hice esto porque no vi nada en la respuesta de Stéphane que funcionara de manera inmediata en la concha de pescado. De lo contrario, la respuesta de Stéphane parece buena).

Aaron Feldman
fuente
3

Para POSIX, $'...'como se conoce como escape ANSI-C, no está definido.

En cambio, puedes usar $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')se puede usar, ya que 011(representación octal del decimal 9) es el código ANSI para un carácter de tabulación horizontal:

column -t -s "$(printf '\011')"

Sin embargo, vea los comentarios a continuación de Stéphane Chazelas sobre por qué esto puede no ser coherente en las versiones de shell.

Nick Bull
fuente
2
Tenga en cuenta que POSIX no especifica cuál es la codificación de TAB. Todavía hay sistemas POSIX cuya codificación de configuración regional C está basada en EBCDIC donde TAB es 5, no 9 como en ASCII. Siempre que sea posible, es mejor referirse a los caracteres por nombre para evitar este tipo de problema, "$(printf '\t')"como se muestra en mi respuesta. Tenga en cuenta que $'...'está previsto incluirlo en la próxima versión principal de la especificación POSIX.
Stéphane Chazelas
@ StéphaneChazelas es $(printf '\t')POSIX? ¡Gracias!
Nick Bull
3
Stéphane Chazelas
@ StéphaneChazelas Muchas gracias, he actualizado mi respuesta para incluir su consejo muy útil :)
Nick Bull
2

El -tes para seleccionar el número de columnas que desea. Dejar esto en blanco no cambia nada. Además, si quieres espacios en blanco después, -sprueba esto:

cat myfile | column -s \t

mirón
fuente
Gracias. Esto está cerca de lo que estoy buscando. Sin embargo, ahora todas las líneas se fusionan en una sola. ¿Cómo puedo mantener cada línea en su propia línea?
tortuga
Por defecto, columnllena las filas antes de las columnas. Te puede interesarpr
merodeador