Применение головы Unix к AWK с помощью команды поиска
Вопрос
Я хочу вывести 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
.