Как получить второй столбец из вывода команды?

152

Вывод моей команды выглядит примерно так:

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

Первый столбец - это всегда число, за которым следует пробел, а затем строка в двойных кавычках.

Моя цель - получить только второй столбец, например:

"A B"
"C"
"D"

Я намеревался использовать <some_command> | awk '{print $2}'для этого. Но вопрос в том, что некоторые значения во втором столбце содержат пробелы, которые являются разделителем по умолчанию для awkразделения полей. Следовательно, вывод испорчен:

"A
"C"
"D"

Как правильно получить значение второго столбца (с парными кавычками)?

Цян Сюй
источник
1
stackoverflow.com/questions/2961635/…
Мартин Клейтон
1
Я пытался использовать awk '{$1=""; print $0}', но он по-прежнему имеет ведущий пробел. Это может быть удалено sed '/^ //'. Но можно ли это сделать awk?
Цян Сюй

Ответы:

29

Или используйте sed & regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
catay
источник
Короче cmd, так как вам не нужны начальные и конечные маркеры:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo
197

Используйте, -F [field separator]чтобы разбить строки на "s:

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

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

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

вывод:

A B
C
D
Alex
источник
3
Это хорошо, но я также хочу оригинальные окружающие цитаты. Можно ли это сделать? Спасибо.
Цян Сюй
5
Вы можете обмануть и изменить печать awk на'{print "\""$2"\""}'
Алекс
Да, это работает. Большое спасибо, Алекс! Кстати, так много цитат, :)
Цян Сюй
@ Алекс, не могли бы вы объяснить, как вы использовали двойные кавычки и обратную косую черту, чтобы получить то, что хотел опер.
Тимо
1
@Timo Расстановка кавычек и обратной косой черты может быть представлена ​​как "\"" + $2 + "\"". Окружающие кавычки указывают на то, что нужно добавить к выводу, и экранированная кавычка ( \") печатается. Для того, чтобы помочь себе это, это то , что это будет выглядеть , если мы хотим , чтобы добавить пробелы вокруг $2вместо кавычки: '{print " "$2" "}'. Мы также можем добавить интервал между форматами, чтобы немного упростить работу:'{print " " $2 " "}'
Том
80

Если вы могли бы использовать что-то кроме «awk», то попробуйте это вместо

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

-d - разделитель, -f - поле для обрезки, и с помощью -f2- мы намерены обрезать 2-е поле до конца.

TheAshwaniK
источник
это помогло мне попытаться сделать следующее (получить идентификатор фиксации файла в git): git annotate myfile.cpp | grep '2016-07' | голова -1 | cut
-f1
2
Это хорошо, но не работает, если разделитель имеет длину более одного символа. Вот где решение awk пригодится
smac89
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

Это собирается напечатать третий столбец

hemanto
источник
Вы видели из докера изображения | awk '{print $ 5}'?
Шаши Ранджан
17

Вам не нужен awk для этого. Использование readв оболочке Bash должно быть достаточно, например

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

или:

while read c1 c2; do echo $c2; done < in.txt
kenorb
источник
13

Если у вас есть GNU awk, это решение, которое вы хотите:

$ 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

Затем, предположим, вы называете скрипт как co, скажем, что-то вроде этого, чтобы получить размеры файлов (в примере предполагается, что вы используете Linux, но сам скрипт не зависит от ОС): -

ls -lh | co 5

Энди Саутвелл
источник