Estoy tratando de extraer un cierto (el cuarto) campo de la secuencia de texto ajustada por 'espacio' basada en columnas. Estoy tratando de usar el cutcomando de la siguiente manera:
cat text.txt | cut -d " " -f 4
Desafortunadamente, cutno trata varios espacios como un delimitador. Podría haber pasado por awk
awk '{ printf $4; }'
o sed
sed -E "s/[[:space:]]+/ /g"
colapsar los espacios, pero me gustaría saber si hay alguna forma de tratar cuty varios delimitadores de forma nativa?

Respuestas:
Tratar:
Desde el
trpágina manual:-s, --squeeze-repeats reemplaza cada secuencia de entrada de un carácter repetido que aparece en SET1 con una sola aparición de ese personajefuente
cataquí. Podrías pasar< text.txtdirectamente atr. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-dy traducir directamente de varios caracteres a la pestaña. Por ejemplo: vine aquí buscando una manera de exportar automáticamente mi pantalla:who am i | tr -s ' ()' '\t' | cut -f5echo "a b c" | cut -d " " -f2-,echo "a b c" | tr -s " " | cut -d " " -f2-Como comentas en tu pregunta,
awkes realmente el camino a seguir. El usocutes posible junto contr -sexprimir espacios, como lo muestra la respuesta de kev .Sin embargo, permítanme analizar todas las combinaciones posibles para futuros lectores. Las explicaciones se encuentran en la sección Prueba.
tr | cortar
awk
intento
sed
Pruebas
Dado este archivo, probemos los comandos:
tr | cortar
awk
intento
Esto lee los campos secuencialmente. Al usarlo
_, indicamos que esta es una variable desechable como una "variable basura" para ignorar estos campos. De esta manera, almacenamos$myfieldcomo el cuarto campo en el archivo, sin importar los espacios entre ellos.sed
Esto atrapa tres grupos de espacios y no espacios con
([^ ]*[ ]*){3}. Luego, atrapa lo que viene hasta un espacio como el cuarto campo, con el que finalmente se imprime\1.fuente
awkno solo es elegante y simple, también se incluye en VMware ESXi, dondetrfalta.awk!readcomando, si no nos importa lo que implica . Puede ser cualquier cosa, es solo que de alguna manera se convirtió en estándar en lugar dejunk_varowhatever:)solución más corta / amigable
Después de frustrarme con las demasiadas limitaciones de
cut, escribí mi propio reemplazo, que pedícuts"cortar con esteroides".cortes proporciona lo que probablemente sea la solución más minimalista para este y muchos otros problemas relacionados con cortar / pegar.
Un ejemplo, de muchos, aborda esta pregunta en particular:
cutsapoya:pasteseparado)y mucho más. Ninguno de los cuales es proporcionado por estándar
cut.Ver también: https://stackoverflow.com/a/24543231/1296044
Fuente y documentación (software libre): http://arielf.github.io/cuts/
fuente
Este Perl one-liner muestra cuán estrechamente se relaciona Perl con awk:
Sin embargo, la
@Fmatriz autosplit comienza en el índice$F[0]mientras que los campos awk comienzan con$1fuente
Con versiones de lo
cutque sé, no, esto no es posible.cutes principalmente útil para analizar archivos donde el separador no es un espacio en blanco (por ejemplo/etc/passwd) y que tienen un número fijo de campos. Dos separadores seguidos significan un campo vacío, y eso también se aplica al espacio en blanco.fuente