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 cut
comando de la siguiente manera:
cat text.txt | cut -d " " -f 4
Desafortunadamente, cut
no 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 cut
y varios delimitadores de forma nativa?
Respuestas:
Tratar:
Desde el
tr
página manual:fuente
cat
aquí. Podrías pasar< text.txt
directamente atr
. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
y 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 -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Como comentas en tu pregunta,
awk
es realmente el camino a seguir. El usocut
es posible junto contr -s
exprimir 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$myfield
como 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
awk
no solo es elegante y simple, también se incluye en VMware ESXi, dondetr
falta.awk
!read
comando, 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_var
owhatever
:)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:
cuts
apoya:paste
separado)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
@F
matriz autosplit comienza en el índice$F[0]
mientras que los campos awk comienzan con$1
fuente
Con versiones de lo
cut
que sé, no, esto no es posible.cut
es 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