Эффективное кодирование для подсчета заглавных символов в файле - PullRequest
0 голосов
/ 05 октября 2019

Я хочу посчитать все заглавные буквы AZ из файла.

Я беру файл в качестве аргумента, а затем я ищу во всем файле каждую букву и суммирую свой результат. Мой код работает нормально, но есть ли другой способ сделать его более эффективным, без использования цикла?

sum=0
for var in {A..Z}
do
    foo="$(grep -o $var "$1"| wc -l)"
    sum=$((sum+foo))
done

Я пытался сделать это так, но это дает мне неверные результаты, потому что его счетные пробелы и конечная строка.

cat  "$1" | wc -m

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Вы можете сделать это с помощью одной команды grep, аналогичной той, что вы уже делаете:

grep -o "[A-Z]" "$1" | wc -l
1 голос
/ 05 октября 2019

Мы действительно можем избежать использования нескольких программ для подсчета заглавных букв в файле, это можно легко сделать с помощью одного awk, и это сэкономит нам несколько циклов и должно быть также БЫСТРО.

Не могли бы вы попробовать следующее.

awk '
{
  count+=gsub(/[A-Z]/,"&")
}
END{
  print "Total number of capital letters in file are: " count
}
'  Input_file

Если вы хотите запустить его как скрипт, который принимает Input_file в качестве аргумента, также измените Input_file на $1.

Объяснение: Добавление пояснения к приведенному выше коду, только для целей пояснения, а не для выполнения (следующего).

awk '                                                                   ##Starting awk program here.
{
  count+=gsub(/[A-Z]/,"&")                                              ##Creating a variable named count whose value will be keeping adding to itself, each time a substitution done from gsub.
                                                                        ##where gsub is awk out of the box function to substitute.
                                                                        ##Using gsub I am substituting each capital letter with itself and adding its count to count variable.
}
END{                                                                    ##Starting END block for this awk program. which will be executed once Input_file is done with reading.
  print "Total number of capital letters in file are: " count           ##Printing total number of capital letters which are there in count variable.
}
'  Input_file                                                           ##mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...