Применение Unix Head на AWK с помощью команды Find

Я хочу вывести 10 лучших строк команды AWK в списке файлов, заданных find, используя этот фрагмент:

$ find . -name "*.txt" -print -exec awk '$9 != ""'  \| head -n10 {} \;

Обратите также внимание, что я хочу распечатать имена обрабатываемых файлов.

Но почему я получаю такую ​​ошибку:

awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt

Как правильно это сделать?

Пробовал без обратной косой черты перед трубой. Все равно выдавало ошибку:

find: missing argument to `-exec'
head: cannot open `{}' for reading: No such file or directory
head: cannot open `;' for reading: No such file or directory

person neversaint    schedule 02.04.2009    source источник
comment
Пожалуйста, уточните, что вы пытаетесь сделать. Создается впечатление, что вы пытаетесь достичь двух целей одновременно.   -  person Yuval F    schedule 02.04.2009
comment
@YuvalF: 1. С помощью AWK отфильтруйте строки, содержащиеся в 9-м столбце; 2. Показывать только первые 10 строк - после фильтра.   -  person neversaint    schedule 02.04.2009
comment
Попробуйте мое обновленное решение.   -  person Zsolt Botykai    schedule 02.04.2009
comment
Еще раз с печатью имени файла в качестве разделителя.   -  person Zsolt Botykai    schedule 02.04.2009


Ответы (5)


Если вы хотите запускать программу Awk для каждого файла из find, который печатает только первые 10 строк каждый раз.

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
person ashawley    schedule 03.04.2009

При запуске команды с помощью find'а -exec вы не получаете всех приятных возможностей оболочки, таких как оператор конвейера (|). Вы можете восстановить их, явно запустив подоболочку, если хотите, например:

найти . -name '*.txt' -exec /bin/sh -c "отобразить текстовый файл с именем {} | head -n 15" \;

person Anthony Towns    schedule 02.04.2009

На основе ответа Эшоли:

find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;

Он должен работать лучше, так как мы выходим из awk после 10-й записи.

person MatthieuP    schedule 06.04.2009
comment
Он выходит после десятой записи, но не после десятой печатной строки, чего хотел ОП, и дает ответ Эшоли. - person Dennis Williamson; 23.05.2009

Использование только awk должно работать:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
person mouviciel    schedule 02.04.2009
comment
@mouviciel: спасибо. Как я могу заставить его также печатать имя обрабатываемого файла? - person neversaint; 02.04.2009

Вы также можете сделать это следующим образом:

find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {}  \;

без head.

person Zsolt Botykai    schedule 02.04.2009
comment
@Zsolt: я пытался. Для каждого файла ваш фрагмент продолжается даже после 10-й строки. - person neversaint; 02.04.2009
comment
@Zsolt: спасибо. Как я могу заставить его также печатать имя файла (как разделитель)? - person neversaint; 02.04.2009