2013-04-21 14 views
86

mój rozkaz jest coś takiego:Jak uzyskać drugą kolumnę z danych wyjściowych polecenia? Wyjście

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

Pierwsza kolumna jest zawsze liczbą, a następnie po spacji, a następnie podwójnie cytowany string.

Moim celem jest, aby tylko drugą kolumnę, jak:

"A B" 
"C" 
"D" 

zamierzałem użyć <some_command> | awk '{print $2}' do osiągnięcia tego celu. Ale pytanie brzmi, niektóre wartości w drugiej kolumnie zawierają spacje (przestrzenie), które są domyślnym separatorem dla awk, aby oddzielić pola. Dlatego wyjście jest pomieszane:

"A 
"C" 
"D" 

Jak uzyskać czystą wartość drugiej kolumny (z cytowanymi parami)?

+1

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

+1

Próbowałem używając 'awk '{$ 1 =" "; print $ 0} '', ale nadal ma wiodący znak spacji. Może zostać usunięty przez 'sed '/^//''. Czy można to zrobić za pomocą 'awk'? –

Odpowiedz

22

lub wykorzystanie sed & wyrażenia regularnego.

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

Całkiem schludne! Dzięki! –

116

Zastosowanie -F [field separator] podzielić linie na " s:

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

lub wkład z rury

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

Wydajność:

A B 
C 
D 
+3

To jest dobre, ale chcę również oryginalne, otaczające cytaty. Czy to możliwe? Dzięki. –

+5

można oszukać i zmienić druk awk na ''{print" \ "" $ 2 "\" "}" ' – Alex

+0

Tak, to działa. Wielkie dzięki, Alex! A tak przy okazji, tyle cytatów, :) –

9

Jeśli masz GNU awk jest to rozwiązanie chcesz:

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

Jeśli można użyć czegoś innego niż 'awk', a następnie spróbuj zamiast tego

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

-d jest ogranicznikiem, -f jest pole do wycięcia i z -f2- zamierzamy wyciąć drugie pole do końca.

+0

pomogło mi to spróbować wykonać następujące czynności (pobrać identyfikator zatwierdzenia pliku w git): git annotate myfile.cpp | grep '2016-07' | głowa -1 | cut -f1 – serup

+0

To jest dobre, ale nie działa, jeśli separator ma więcej niż jeden znak. W tym miejscu przydatne jest rozwiązanie awk. – smac89

+0

Dlaczego spacja nie jest używana po '-d'? W ten sposób wygląda trochę dziwnie. –

12

Nie potrzebujesz do tego awk. Używanie w powłoce Bash powłoki read powinno wystarczyć, np.

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

czyli

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

To powinno działać, aby uzyskać konkretną kolumnę z wyjściem polecenia "obrazy dokowane":

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 

To będzie drukować trzecią kolumnę

+0

Widziałeś już obrazy dockera | awk "{wydrukuj 5 USD}"? –

Powiązane problemy