Применение головы Unix к AWK с помощью команды поиска

StackOverflow https://stackoverflow.com/questions/708577

  •  22-08-2019
  •  | 
  •  

Вопрос

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

$ 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
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;

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

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

без head.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top