Как напечатать поле из файла, разделенного каналом - PullRequest
6 голосов
/ 18 октября 2008

У меня есть файл с полями, разделенными символами канала, и я хочу напечатать только второе поле. Эта попытка не удалась:

$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found

Есть ли способ сделать это?

Ответы [ 4 ]

18 голосов
/ 18 октября 2008

Или просто используйте одну команду:

cut -d '|' -f FIELDNUMBER
9 голосов
/ 18 октября 2008

Ключевым моментом здесь является то, что символ канала (|) должен быть экранирован в оболочку. Используйте "\|" или "'|'", чтобы защитить его от вмешательства оболочки и разрешить его передачу в awk в командной строке.


Читая комментарии, я вижу, что оригинальный постер представляет упрощенную версию исходной задачи, которая включала фильтрацию file перед выбором и печатью полей. Был использован пропуск grep, и результат был передан в awk для выбора поля. Это объясняет совершенно ненужный cat file, который появляется в вопросе (он заменяет grep <pattern> file).

Хорошо, это сработает. Тем не менее, awk в значительной степени является инструментом сопоставления с образцом сам по себе, и ему можно доверять, чтобы находить и работать с совпадающими строками без необходимости вызывать grep. Используйте что-то вроде:

awk -F\| '/<pattern>/{print $2;}{next;}' file

Бит /<pattern>/ указывает awk выполнить действие, которое следует за строками, которые соответствуют <pattern>.

Потерянный {next;} - это действие по умолчанию, пропускающее следующую строку ввода. В этом нет необходимости, но у меня есть эта привычка издавна ...

3 голосов
/ 18 октября 2008

Символ трубы должен быть экранирован, чтобы оболочка не интерпретировала его. Простое решение:

$ awk -F\| '{print $2}' file

Другой вариант - процитировать персонажа:

$ awk -F'|' '{print $2}' file
0 голосов
/ 18 октября 2008

И «файл» не содержит символов канала, поэтому он ничего не печатает. Вы должны либо использовать 'cat file', либо просто перечислить файл после программы awk.

...