Pregunta

Quiero usar el espacio como delimitador con el cut dominio.

¿Qué sintaxis puedo usar para esto?

¿Fue útil?

Solución

cut -d ' ' -f 2

Donde 2 es el número de campo del campo delimitado por espacios que desea.

Otros consejos

Por lo general, si usa el espacio como delimitador, desea tratar múltiples espacios como uno, porque analiza la salida de un comando alineando algunas columnas con espacios. (y la búsqueda de Google para eso me llevó aquí)

En este caso, un solo comando cut no es suficiente y debe usar:

tr -s ' ' | cut -d ' ' -f 2

O

awk '{print $2}'

Para complementar las respuestas útiles existentes; Punta del sombrero para Soporte QZ por alentarme a publicar una respuesta por separado:

Dos mecanismos distintos entran en juego aquí:

  • (a) si cut en sí requiere que el delimitador (espacio, en este caso) pasado a la opción -d sea un argumento separado o si es aceptable agregarlo 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 directrices 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 eso 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, porque el argumento de opción de -d " " es obligatorio , puede elegir si se debe especificar el delimitador como :

  • (s) CUALQUIERA: un argumento separado
  • (d) O: como un valor directamente adjunto a -d \<space> # <space> used to represent an actual space for technical reasons .

Una vez que haya elegido (s) o (d), lo que importa es el análisis de cadena literal de shell - (b):

  • Con el enfoque (s) , todos los siguientes formularios son EQUIVALENTES:

    • -d' '
    • -d" "
    • "-d "
  • Con el enfoque (d) , todas las siguientes formas son EQUIVALENTES:

    • '-d '
    • d\<space>
    • \
    • '...'
    • "..."

La equivalencia se explica por el procesamiento de cadena literal del shell :

Todas las soluciones anteriores dan como resultado exactamente la misma cadena (en cada grupo) cuando $var las ve :

  • (s) : $(...) ve `...`, como su argumento propio , seguido de un argumento separado que contiene un espacio de caracteres - sin comillas o $(( ... )) prefijo !.

  • (d) : <=> ve <=> plus un carácter de espacio - ¡sin comillas ni prefijo <=>! - como parte del argumento mismo .

La razón por la cual los formularios en los grupos respectivos son idénticos es doble, basada en cómo shell analiza literales de cadena :

  • El shell permite que el literal se especifique como está a través de un mecanismo llamado quoting , que puede tomar varias formas :
    • cadenas de comillas simples : el contenido dentro de <=> se toma literalmente y forma un argumento simple
    • Cadenas
    • comillas dobles : el contenido dentro de <=> también forma un argumento único , pero está sujeto a interpolación (expande las referencias variables como <=>, sustituciones de comandos (<=> o <=>) o expansiones aritméticas (<=>).
    • <=>: cita de caracteres individuales : un <=> que precede a un solo carácter hace que ese carácter se interprete como un literal.
  • Las citas se complementan con eliminación de citas , lo que significa que una vez que el shell ha analizado una línea de comando, elimina los caracteres de comillas de los argumentos (encerrando <=> o <=> o <=> instancias), por lo tanto, elel comando invocado nunca ve los caracteres de comillas .

También puedes decir

cut -d\  -f 2

tenga en cuenta que hay dos espacios después de la barra invertida.

I acabo de descubrir que también puede use "-d ":

cut "-d "

Prueba

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

rabo, 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.La división en espacios en blanco es la opción predeterminada, pero también puede hacerlo en expresiones regulares de varios caracteres, expresiones regulares alternativas, etc.

scut -f='6 2 8 7' < input.file  > output.file

por lo que el comando anterior dividiría las columnas en espacios en blanco y extraería las columnas (basadas en 0) 6 2 8 7 en ese orden.

No puede hacerlo fácilmente con cortar si los datos tienen, por ejemplo, múltiples espacios. He encontrado ú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

Tengo una respuesta (admito una respuesta un tanto confusa) que implicased, expresiones regulares y grupos de captura:

  • \S* - primera palabra
  • \s* - delimitador
  • (\S*) - segunda palabra - capturado
  • .* - resto de la línea

Como un sed expresión, es necesario escapar del grupo de captura, 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 confusa y puedes pensar, ¿para qué molestarse?Bueno, espero que algunos puedan ir "¡Ajá!" y usará este patrón para resolver algunos problemas complejos de extracción de texto con un solo sed expresión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top