Як отримати другий стовпчик з виводу команди?


152

Вихід моєї команди - це щось на зразок:

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

Перший стовпець - це завжди число, після якого пробіл, а потім рядок з подвійним цитуванням.

Моя мета - отримати лише другий стовпчик, наприклад:

"A B"
"C"
"D"

Я мав намір використати <some_command> | awk '{print $2}'для цього. Але питання полягає в тому, що деякі значення у другому стовпчику містять простір (и), який, як правило, є роздільником за замовчуванням для awkрозділення полів. Отже, вихід змішується:

"A
"C"
"D"

Як я можу отримати чисте значення другого стовпця (з парними лапками)?



1
Я спробував використати awk '{$1=""; print $0}', але він все ще має провідний характер пробілу. Його можна було видалити sed '/^ //'. І все-таки це можна зробити awk?
Цянь Сю

Відповіді:


29

Або скористайтеся sed & regex.

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

Коротше cmd, оскільки вам не потрібні початкові та кінцеві маркери:<some_command> | sed 's/.* \(".*"\)/\1/'
Тимо

197

Використовуйте -F [field separator]для розділення рядків на "s:

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

або для введення з труби

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

вихід:

A B
C
D

3
Це добре, але я також хочу оригінальних навколишніх цитат. Чи можна це зробити? Дякую.
Цянь Сю

5
ви можете обдурити і змінити друк awk на'{print "\""$2"\""}'
Alex

Так, це працює. Велике спасибі, Алекс! До речі, стільки цитат, :)
Цянь Сю

@ Алекс, чи можете ви пояснити, як ви використовували подвійні лапки та зворотну косу рису, щоб отримати те, що хотіла оп.
Тимо

1
@Timo Розбиття котирувань та зворотних косих ринків можна передбачити як "\"" + $2 + "\"". Навколишні лапки вказують на те, що потрібно додати до виводу, а \"друкований знак лапки ( ) друкується. Для того, щоб допомогти собі це, це те , що це буде виглядати , якщо ми хочемо , щоб додати прогалини навколо $2замість лапки: '{print " "$2" "}'. Ми також можемо додати інтервал між форматами, щоб зробити його легше:'{print " " $2 " "}'
Том,

80

Якщо ви можете використовувати щось інше, ніж 'awk', то спробуйте це замість цього

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

-d - це роздільник, -f - поле для розрізання, а з -f2- ми маємо намір вирізати 2-е поле до кінця.


це допомогло мені спробувати зробити наступне (отримати присвоєння ідентифікатора файлу в git): git annotate myfile.cpp | grep '2016-07' | голова -1 | cut -f1
serup

2
Це добре, але не працює, якщо роздільник більше одного символу. Ось тут
корисне

2
Чому простір не використовується після -d? Це виглядає дещо дивно.
Кріс Стричинський

43

Це повинно працювати для виведення певного стовпця з команди виведення "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

Це буде надрукувати третю колонку


Ви бачили, як розміщені зображення докера | awk '{print $ 5}'?
Shashi Ranjan

17

Для цього вам не потрібно пробудити. Використання readв оболонці Bash має бути достатньо, наприклад

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

або:

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



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

Тоді, припустимо, ви називаєте сценарій як co, скажімо, зробіть щось подібне, щоб отримати розміри файлів (приклад передбачає, що ви використовуєте Linux, але сам сценарій не залежить від ОС): -

ls -lh | co 5

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.