2013-04-21 28 views
86

mio del comando è qualcosa di simile:Come ottenere la seconda colonna dall'output del comando? Uscita

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

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

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

"A B" 
"C" 
"D" 

avevo intenzione di usare <some_command> | awk '{print $2}' per raggiungere questo obiettivo. Ma la domanda è, alcuni valori nella seconda colonna contengono spazio (s), che risulta essere il delimitatore predefinito per awk per separare i campi. Pertanto, l'uscita è incasinato:

"A 
"C" 
"D" 

Come faccio ad avere il secondo valore della colonna (con le virgolette accoppiati) in modo pulito?

+1

http://stackoverflow.com/questions/2961635/using-awk-to-print-all-columns-from-the-nth-to-last –

+1

Ho provato usando 'awk '{$ 1 =" "; stampa $ 0} '', ma ha ancora un carattere iniziale di spazio bianco. Potrebbe essere rimosso da 'sed '/^//''. Eppure, questo potrebbe essere fatto con 'awk'? –

risposta

22

O uso sed & regex.

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

Abbastanza pulito! Grazie! –

116

Usa -F [field separator] per dividere le linee in " s:

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

o per l'input da tubo

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

uscita:

A B 
C 
D 
+3

Questo è buono, ma voglio anche le virgolette originali circostanti. Potrebbe essere fatto? Grazie. –

+5

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

+0

Sì, funziona. Grazie mille, Alex! A proposito, così tante citazioni, :) –

9

Se avete GNU awk questa è la soluzione che si desidera:

$ awk '{print $1}' FPAT='"[^"]+"' file 
"A B" 
"C" 
"D" 
0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file 
54

Se si potrebbe usare qualcosa di diverso 'awk', quindi provare questo invece

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

-d è un delimitatore, -f è il campo da tagliare e con -f2- abbiamo intenzione di tagliare il 2 ° campo fino alla fine.

+0

questo mi ha aiutato a provare a fare il seguente (recuperare l'ID di commit di un file in git): git annotate myfile.cpp | grep '2016-07' | capo -1 | cut -f1 – serup

+0

Questo è buono, ma non funziona se il delimitatore è lungo più di un carattere. Ecco dove la soluzione di awk diventa utile – smac89

+0

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

12

Non hai bisogno di awk per quello. L'uso di read nella 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

questo dovrebbe funzionare per ottenere una determinata colonna fuori l'output del comando "immagini della finestra mobile":

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

+0

Hai visto le immagini delle finestre mobili? awk '{print $ 5}'? –