Jak uzyskać drugą kolumnę z danych wyjściowych polecenia?

152

Wynik mojego polecenia jest taki:

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

Pierwsza kolumna jest zawsze liczbą, po której następuje spacja, a następnie ciąg w cudzysłowie.

Moim celem jest zdobycie tylko drugiej kolumny, na przykład:

"A B"
"C"
"D"

Zamierzałem użyć, <some_command> | awk '{print $2}'aby to osiągnąć. Ale pytanie brzmi, niektóre wartości w drugiej kolumnie zawierają spacje, które są domyślnym ogranicznikiem awkdo oddzielania pól. Dlatego wynik jest pomieszany:

"A
"C"
"D"

Jak wyczyścić wartość drugiej kolumny (z cudzysłowami)?

Qiang Xu
źródło
1
Próbowałem użyć awk '{$1=""; print $0}', ale nadal ma wiodący znak spacji. Może zostać usunięty przez sed '/^ //'. Ale czy można to zrobić awk?
Qiang Xu,

Odpowiedzi:

29

Lub użyj sed i regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
catay
źródło
Krótszy cmd, ponieważ nie potrzebujesz znaczników początku i końca:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo
197

Użyj, -F [field separator]aby podzielić linie na "s:

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

lub do wejścia z rury

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

wynik:

A B
C
D
Alex
źródło
3
To dobrze, ale chcę również oryginalne cytaty z otoczenia. Czy można to zrobić? Dzięki.
Qiang Xu,
5
można by oszukiwać i zmienić wydruk awk na'{print "\""$2"\""}'
Alex
Tak, to działa. Wielkie dzięki, Alex! Nawiasem mówiąc, tyle cytatów :)
Qiang Xu
@Alex, czy mógłbyś wyjaśnić, jak użyłeś podwójnych cudzysłowów i odwrotnego ukośnika, aby uzyskać to, czego chciał operacja.
Timo
1
@Timo Podział cudzysłowów i ukośników odwrotnych można sobie wyobrazić jako "\"" + $2 + "\"". Otaczające cudzysłowy wskazują coś, co ma być dołączone do wyniku, a \"drukowany jest cudzysłów ( ). Aby pomóc w wizualizacji, to co to będzie wyglądać, jeśli chcemy dodać puste przestrzenie wokół $2zamiast cudzysłowu: '{print " "$2" "}'. Możemy również dodać odstępy między formatami, aby trochę łatwiej było zrozumieć:'{print " " $2 " "}'
Tom
80

Jeśli mógłbyś użyć czegoś innego niż „awk”, spróbuj tego zamiast tego

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

-d to ogranicznik, -f to pole do wycięcia, a -f2- zamierzamy wyciąć drugie pole do końca.

TheAshwaniK
źródło
pomogło mi to w wykonaniu następujących czynności (pobranie identyfikatora zatwierdzenia pliku w git): git adnotacja myfile.cpp | grep „2016-07” | głowa -1 | cut -f1
serup
2
Jest to dobre, ale nie działa, jeśli separator ma więcej niż jeden znak.
Tutaj
2
Dlaczego przestrzeń nie jest używana później -d? W ten sposób wygląda to trochę dziwnie.
Chris Stryczynski
43

Powinno to zadziałać, aby uzyskać określoną kolumnę z wyniku 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

Spowoduje to wydrukowanie trzeciej kolumny

hemanto
źródło
Widziałeś już zdjęcia dockerów | awk '{print $ 5}'?
Shashi Ranjan
17

Nie potrzebujesz do tego awk. Za pomocąread w powłoce Bash powinno wystarczyć np

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

lub:

while read c1 c2; do echo $c2; done < in.txt
kenorb
źródło
13

Jeśli masz GNU awk, to jest to rozwiązanie, którego potrzebujesz:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
Chris Seymour
źródło
0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
Vijay
źródło
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

Następnie, załóżmy, że nazwiesz skrypt jako co, powiedzmy, zrób coś takiego, aby uzyskać rozmiary plików (przykład zakłada, że ​​używasz Linuksa, ale sam skrypt jest niezależny od systemu operacyjnego): -

ls -lh | co 5

Andy Southwell
źródło