Как вывести количество вхождений согласных для каждого файла отдельно с помощью awk?

Да, вы можете использовать %if/%endif, пример изменения цвета строки состояния на разных хостах есть в руководстве (смотрите в исходном -файле ). Это будет то же самое, за исключением того, что вы измените опцию префикса.

3
28.03.2021, 16:46
2 ответа

С 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для ответа на дополнительный вопрос о подсчете гласных.

6
28.04.2021, 22:56

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, он все равно не работает с многобайтовыми символами.)

2
28.04.2021, 22:56

Теги

Похожие вопросы