Да, вы можете использовать %if/%endif, пример изменения цвета строки состояния на разных хостах есть в руководстве (смотрите в исходном -файле ). Это будет то же самое, за исключением того, что вы измените опцию префикса.
С GNU awk для ENDFILE и IGNORECASE:
$ awk -v IGNORECASE=1 '
{ cnt += ( gsub(/[[:alpha:]]/,"&") - gsub(/[aeiou]/,"&") )}
ENDFILE { print FILENAME, cnt+0; cnt=0 }
' file1 file2
file1 12
file2 7
или с любым POSIX awk:
$ awk '
{ lc=tolower($0); cnt[FILENAME] += (gsub(/[[:alpha:]]/,"&",lc) - gsub(/[aeiou]/,"&",lc)) }
END { for (i=1; i<ARGC; i++) print ARGV[i], cnt[ARGV[i]]+0 }
' file1 file2
file1 12
file2 7
Если вы хотите подсчитывать только определенные символы b, c, d и т. д. вместо всех буквенных символов, которые не являются aeiou, просто измените ( gsub(/[[:alpha:]]/,"&") - gsub(/[aeiou]/,"&") )
выше наgsub(/[bcdfghjklmnpqrtsvwxyz]/,"&"))
Обратите внимание, что, в отличие от любого подхода, который печатает результаты в предложении FNR==1
, оба вышеприведенных скрипта будут корректно обрабатывать пустые файлы, печатая имя файла и 0 в качестве счетчика.
Также обратите внимание на cnt+0
в первом скрипте -+0
гарантирует, что напечатанное значение будет числовым 0
, а не нулевой строкой, если первый файл пуст.
Если одно и то же имя файла может появляться во входных данных несколько раз, добавьте FNR==1{cnt[FILENAME]=0}
в начало скрипта, если вы хотите, чтобы он выводился несколько раз, или добавьте if (!seen[ARGV[i]]++) {... }
вокруг печати в разделе END, если вы только этого хотите. вывод один раз.
См.https://unix.stackexchange.com/a/642372/133219для ответа на дополнительный вопрос о подсчете гласных.
FWIW, и, вероятно, немного, у меня возникло бы искушение сделать это безawk
:
consonants=bcdfghjklmnpqrtsvwxyz
for f in file*; do
printf "%s %d\n" "$f" "$(< "$f" tr A-Z a-z | tr -dc "$consonants" | wc -c)"
done
Хотя это, конечно, вполне ASCII -центрично (, и если у вас есть GNU tr, он все равно не работает с многобайтовыми символами.)