¿Cómo obtener la segunda columna de la salida del comando?

152

La salida de mi comando es algo como:

1540 "A B"
   6 "C"
 119 "D"

La primera columna siempre es un número, seguido de un espacio, luego una cadena entre comillas dobles.

Mi propósito es obtener solo la segunda columna, como:

"A B"
"C"
"D"

Tenía la intención de utilizar <some_command> | awk '{print $2}'para lograr esto. Pero la pregunta es, algunos valores en la segunda columna contienen espacio (s), que resulta ser el delimitador predeterminado para awkseparar los campos. Por lo tanto, la salida está en mal estado:

"A
"C"
"D"

¿Cómo obtengo el valor de la segunda columna (con comillas emparejadas) limpiamente?

Qiang Xu
fuente
1
Intenté usarlo awk '{$1=""; print $0}', pero todavía tiene un carácter de espacio en blanco líder. Podría ser eliminado por sed '/^ //'. Sin embargo, ¿podría hacerse esto awk?
Qiang Xu

Respuestas:

29

O use sed y regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
catay
fuente
Cmd más corto ya que no necesita marcadores de inicio y fin:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo
197

Use -F [field separator]para dividir las líneas en "s:

awk -F '"' '{print $2}' your_input_file

o para entrada de tubería

<some_command> | awk -F '"' '{print $2}'

salida:

A B
C
D
Alex
fuente
3
Esto es bueno, pero también quiero las citas originales que lo rodean. ¿Se podría hacer? Gracias.
Qiang Xu
55
podrías hacer trampa y cambiar la impresión de awk a'{print "\""$2"\""}'
Alex
Sí, esto funciona. Muchas gracias Alex! Por cierto, muchas citas, :)
Qiang Xu
@Alex, ¿podría explicar cómo utilizó las comillas dobles y la barra diagonal inversa para obtener lo que el operador deseaba?
Timo
1
@Timo El desglose de comillas y barras invertidas se puede visualizar como "\"" + $2 + "\"". Las comillas circundantes indican algo que debe agregarse a la salida, y \"se imprimen las comillas escapadas ( ). Para ayudar a visualizar que, esto es lo que se vería como si quisiéramos añadir espacios en blanco alrededor $2en lugar de las comillas: '{print " "$2" "}'. También podemos agregar espaciado de formato para que sea un poco más fácil de asimilar:'{print " " $2 " "}'
Tom
80

Si pudieras usar algo diferente a 'awk', entonces prueba esto

echo '1540 "A B"' | cut -d' ' -f2-

-d es un delimitador, -f es el campo para cortar y con -f2- pretendemos cortar el segundo campo hasta el final.

TheAshwaniK
fuente
esto me ayudó a tratar de hacer lo siguiente (buscar id de confirmación de un archivo en git): git annotate myfile.cpp | grep '2016-07' | cabeza -1 | corte -f1
serup
2
Esto es bueno, pero no funciona si el delimitador tiene más de un carácter. Ahí es donde la solución awk es útil
smac89
2
¿Por qué no se usa un espacio después -d? Se ve un poco extraño de esa manera.
Chris Stryczynski
43

Esto debería funcionar para obtener una columna específica de la salida del comando "docker images":

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

Esto va a imprimir la tercera columna

hemanto
fuente
¿Has visto poner imágenes de docker | awk '{print $ 5}'?
Shashi Ranjan
17

No necesitas awk para eso. Usar readen Bash Shell debería ser suficiente, p. Ej.

some_command | while read c1 c2; do echo $c2; done

o:

while read c1 c2; do echo $c2; done < in.txt
kenorb
fuente
13

Si tiene GNU awk, esta es la solución que desea:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
Chris Seymour
fuente
0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
Vijay
fuente
0
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

Luego, supongamos que nombra el script como co, por ejemplo, haga algo como esto para obtener el tamaño de los archivos (el ejemplo supone que está utilizando Linux, pero el script en sí es independiente del sistema operativo):

ls -lh | co 5

Andy Southwell
fuente