Как подсчитать появление каждого символа, включая верхний и нижний регистры? - PullRequest
0 голосов
/ 27 мая 2020

Я пытался подсчитать, сколько раз символ появляется в файле, используя следующий код:

sed 's/./&\n/g' 1.txt | sort | uniq -ic

Однако он не различает guish между верхний и нижний регистры. Вот пример:

Содержимое файла 1.txt следующее: hola Adios

И вот результат:

1
2 a
1 d
1 h
1 i
1 l
2 o
1 s

Как видите , У меня есть буквы «а» и «о» 2 раза, но правильный результат должен быть таким:

1
1 a
1 A
1 d
1 h
1 i
1 l
2 o
1 s

Только один раз «а» и один раз «А». Кто-нибудь знает, как я могу изменить код, чтобы получить ожидаемый результат (чтобы различать guish между верхним и нижним регистрами)? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

просто сделайте

sed 's/./&\n/g' 1.txt | sort | uniq -c

, удалив параметр 'i', который не различает верхний и нижний регистр

Выполнение:

pi@raspberrypi:/tmp $ cat 1.txt 
hola Adios
pi@raspberrypi:/tmp $ sed 's/./&\n/g' 1.txt | sort | uniq -c
      1 
      1  
      1 a
      1 A
      1 d
      1 h
      1 i
      1 l
      2 o
      1 s
pi@raspberrypi:/tmp $ 

Обратите внимание на одно из ' 1 'только для новой строки, если я удалю ее во входном файле:

pi@raspberrypi:/tmp $ cat 1.txt 
hola Adiospi@raspberrypi:/tmp $ sed 's/./&\n/g' 1.txt | sort | uniq -c
      1  
      1 a
      1 A
      1 d
      1 h
      1 i
      1 l
      2 o
      1 s
pi@raspberrypi:/tmp $ 
0 голосов
/ 27 мая 2020

Если вы используете пустой разделитель полей в awk, вы можете анализировать по одному символу за раз. Преимущество состоит в том, что вы используете только один процесс и избегаете вставки новой строки с помощью sed для каждого символа, как это было в исходной попытке.

awk -F '' '{for(i=1;i<=NF;i++)a[$i]++}END{for (i in a){print a[i],i}}' 1.txt

Хотя пустой разделитель полей не указан в POSIX, он обычное расширение . Работал с gawk, mawk и nawk.

awk -F '' '                     #Empty field separator
{for(i=1;i<=NF;i++)a[$i]++}     #Each char has an entry in this array and is incremented when found
END{for (i in a){print a[i],i}} #Print number of occurrences and value
' 1.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...