bash - ejemplos - linux shell cut
usar el espacio como un delimitador con comando de corte (8)
No puede hacerlo fácilmente con corte si los datos tienen, por ejemplo, múltiples espacios. Me ha resultado útil normalizar la entrada para un procesamiento más fácil. Un truco es usar sed para la normalización como se muestra a continuación.
echo -e "foor/t /t bar" | sed ''s:/s/+:/t:g'' | cut -f2 #bar
Quiero usar el espacio como un delimitador con el comando de cut
.
¿Qué sintaxis puedo usar para esto?
Normalmente, si usa el espacio como delimitador, desea tratar varios espacios como uno solo, porque analiza la salida de un comando alineando algunas columnas con espacios. (y la búsqueda en google para que me lleve aquí)
En este caso, un solo comando de cut
no es suficiente, y necesita usar:
tr -s '' '' | cut -d '' '' -f 2
O
awk ''{print $2}''
También puede decir
cut -d/ -f 2
Tenga en cuenta que hay dos espacios después de la barra invertida.
Tengo una respuesta (admito una respuesta algo confusa) que involucra expresiones sed
, expresiones regulares y grupos de captura:
-
/S*
- primera palabra -
/s*
- delimitador -
(/S*)
- segunda palabra - capturada -
.*
- resto de la línea
Como una expresión sed
, el grupo de captura debe escaparse, es decir, /(
y /)
.
El /1
devuelve una copia del grupo capturado, es decir, la segunda palabra.
$ echo "alpha beta gamma delta" | sed ''s//S*/s*/(/S*/).*//1/''
beta
Cuando miras esta respuesta, es algo confuso y, puedes pensar, ¿para qué molestarse? Bueno, espero que algunos, puedan decir "¡Ajá!" y utilizará este patrón para resolver algunos problemas complejos de extracción de texto con una única expresión sed
.
Acabo de descubrir que también puedes usar "-d "
:
cut "-d "
Prueba
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
scut , una utilidad similar a un corte (más inteligente pero más lenta que hice) que puede usar cualquier expresión regular de Perl como token de ruptura. Romper en espacios en blanco es el valor predeterminado, pero también puede dividir en expresiones regulares de caracteres múltiples, expresiones regulares alternativas, etc.
scut -f=''6 2 8 7'' < input.file > output.file
por lo tanto, el comando anterior rompería las columnas en el espacio en blanco y extraería las columnas 6 2 8 7 (basadas en 0) en ese orden.
Para complementar las respuestas existentes, útiles; la punta del sombrero a QZ Support para animarme a publicar una respuesta por separado:
Dos mecanismos distintos entran en juego aquí:
(a) si el propio
cut
requiere que el delimitador (espacio, en este caso) pasado a la opción-d
sea un argumento separado o si es aceptable adjuntarlo directamente a-d
.(b) cómo el shell generalmente analiza los argumentos antes de pasarlos al comando que se invoca.
(a) se responde con una cita de las pautas POSIX para servicios públicos (énfasis mío)
Si la SINOPSIS de una utilidad estándar muestra una opción con un argumento de opción obligatorio , una aplicación conforme [...] utilizará argumentos separados para esa opción y su argumento de opción . Sin embargo , una implementación conforme también permitirá que las aplicaciones especifiquen la opción y el argumento de opción en la misma cadena de argumento sin caracteres intermedios .
En otras palabras: en este caso, dado que el argumento-opción de -d
es obligatorio , puede elegir si desea especificar el delimitador como :
- (s) O bien: un argumento separado
- (d) O: como un valor directamente asociado a
-d
.
Una vez que haya elegido (s) o (d), lo que importa es el análisis de cadena literal de la shell - (b) -
Con enfoque (s) , todas las siguientes formas son EQUIVALENTES:
-
-d '' ''
-
-d " "
-
-d /<space> # <space> used to represent an actual space for technical reasons
-
Con el enfoque (d) , todas las siguientes formas son EQUIVALENTES:
-
-d'' ''
-
-d" "
-
"-d "
-
''-d ''
-
d/<space>
-
La equivalencia se explica mediante el procesamiento de cadena-literal:
Todas las soluciones anteriores dan como resultado la misma cadena exacta (en cada grupo) cuando el cut
del tiempo cut
ve :
(s) :
cut
see-d
, como su propio argumento, seguido de un argumento separado que contiene un carácter de espacio, sin comillas ni/
prefijo !.(d) :
cut
ve-d
más un carácter de espacio, sin comillas ni/
prefijo! - Como parte del mismo argumento.
La razón por la que las formas en los grupos respectivos son finalmente idénticas es doble, según la forma en que la shell analiza los literales de cadena :
- El shell permite que el literal se especifique tal como está a través de un mecanismo llamado cotización , que puede tomar varias formas :
- cadenas entre comillas simples : el contenido dentro de
''...''
se toma literalmente y forma un solo argumento - cadenas entre comillas dobles : el contenido dentro de
"..."
también forma un solo argumento, pero está sujeto a interpolación (expande las referencias de variables como$var
, sustituciones de comando ($(...)
o`...`
), o expansiones aritméticas ($(( ... ))
). - cotización de caracteres individuales : a
/
precede a un solo carácter hace que ese carácter se interprete como un literal.
- cadenas entre comillas simples : el contenido dentro de
- La cotización se complementa con la eliminación de comillas , lo que significa que una vez que el shell ha analizado una línea de comando, quita los caracteres de comillas de los argumentos (que encierran
''...''
o"..."
o/
instance), por lo que el comando es invocado nunca ve los caracteres de la cita .
cut -d '' '' -f 2
Donde 2 es el número de campo del campo delimitado por espacios que desea.