Come ottenere la seconda colonna dall'output del comando?


152

L'output del mio comando è simile a:

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

La prima colonna è sempre un numero, seguito da uno spazio, quindi una stringa tra virgolette doppie.

Il mio scopo è quello di ottenere solo la seconda colonna, come:

"A B"
"C"
"D"

Ho intenzione di utilizzare <some_command> | awk '{print $2}'per realizzare questo. Ma la domanda è: alcuni valori nella seconda colonna contengono spazi, che risulta essere il delimitatore predefinito perawk separare i campi. Pertanto, l'output è incasinato:

"A
"C"
"D"

Come posso ottenere il valore della seconda colonna (con virgolette abbinate) in modo pulito?



1
Ho provato a utilizzare awk '{$1=""; print $0}', ma ha ancora un carattere di spazio bianco principale. Potrebbe essere rimosso da sed '/^ //'. Tuttavia, questo potrebbe essere fatto awk?
Qiang Xu,

Risposte:


29

Oppure usa sed & regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'

Cmd più corto in quanto non sono necessari marcatori di inizio e fine:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

197

Utilizzare -F [field separator]per dividere le linee su "s:

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

o per input dalla pipe

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

produzione:

A B
C
D

3
Questo è buono, ma voglio anche le citazioni originali circostanti. Potrebbe essere fatto? Grazie.
Qiang Xu,

5
potresti imbrogliare e cambiare la stampa di awk in'{print "\""$2"\""}'
Alex

Sì, funziona. Grazie mille Alex! A proposito, tante citazioni, :)
Qiang Xu

@Alex, potresti spiegare come hai usato le doppie virgolette e la barra rovesciata per ottenere ciò che voleva l'op.
Timo,

1
@Timo Si può prevedere la suddivisione tra virgolette e barre rovesciate "\"" + $2 + "\"". Le virgolette circostanti indicano qualcosa da aggiungere all'output e le virgolette di escape ( \") vengono stampate. Per aiutare a visualizzare, questo è quello che potrebbe apparire come se volessimo aggiungere spazi vuoti intorno $2invece di virgolette: '{print " "$2" "}'. Possiamo anche aggiungere la spaziatura del formato per rendere un po 'più facile il grok:'{print " " $2 " "}'
Tom

80

Se potessi usare qualcosa di diverso da "awk", prova invece questo

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

-d è un delimitatore, -f è il campo da tagliare e con -f2- intendiamo tagliare il secondo campo fino alla fine.


questo mi ha aiutato a provare a fare quanto segue (recupera ID commit di un file in git): git annotate myfile.cpp | grep '2016-07' | testa -1 | cut -f1
serup

2
Questo è buono, ma non funziona se il delimitatore è lungo più di un carattere. È qui che la soluzione awk è utile
smac89,

2
Perché uno spazio non viene utilizzato dopo -d? Sembra un po 'strano in quel modo.
Chris Stryczynski,

43

Questo dovrebbe funzionare per ottenere una colonna specifica dall'output del comando "immagini docker":

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

Questo sta per stampare la terza colonna


Hai visto mettere immagini docker | awk "{print $ 5}"?
Shashi Ranjan,

17

Non hai bisogno di awk per quello. L'uso readnella shell Bash dovrebbe essere sufficiente, ad es

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

o:

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

13

Se hai GNU awk questa è la soluzione che desideri:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"

0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file

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

Quindi, supponendo di nominare lo script come co, diciamo, fare qualcosa del genere per ottenere le dimensioni dei file (l'esempio presuppone che tu stia utilizzando Linux, ma lo script stesso è indipendente dal sistema operativo): -

ls -lh | co 5

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.