Подсчет количества повторений шаблона в текстовом файле - PullRequest
0 голосов
/ 31 марта 2020

У меня есть такой текстовый файл:

  2 29 31 36 44 50 54  
  15 16 19 25 50 54 29  
  9 11 14 20 24 44 30  
  12 13 15 34 36 47 28  
  12 28 3 40 45 52 46  
  5 23 24 33 48 50 1  
  5 10 11 17 39 48 35  
  3 17 21 36 37 40 53  
  11 20 27 50 54 55 24  

Я хочу подсчитать, сколько раз повторяется каждое число, поэтому я использую этот скрипт:

#!/bin/bash

for n in {1..56}
do
   echo $n >> barchart.txt
   grep -o -i $n text_file.txt | wc -l >> barchart.txt
done

I it работает нормально, единственная проблема в том, что когда я ищу 1, он также считает 10,11,12 ..., 19 как 1. Я хочу знать, сколько раз 1 повторяется в одиночку, то же самое происходит со всеми числами с один ди git: 2,3,4,5,6,7,8 и 9. Я пытался сделать что-то вроде: "$ n" или "$ n", но это не работает, я также смотрел на варианты grep, но я не вижу правильного

Ответы [ 3 ]

3 голосов
/ 31 марта 2020

Это задание больше подходит для awk.

Рассмотрим эту команду gnu-awk:

awk -v RS='[[:space:]]+' '{++freq[$1]} END{for (i in freq) print i, freq[i]}' file

1 1
2 1
3 2
5 2
9 1
10 1
11 3
12 2
13 1
14 1
15 2
16 1
17 2
19 1
20 2
21 1
23 1
24 3
25 1
27 1
28 2
29 2
30 1
31 1
33 1
34 1
35 1
36 3
37 1
39 1
40 2
44 2
45 1
46 1
47 1
48 2
50 4
52 1
53 1
54 3
55 1

Если у вас нет gnu-awk тогда вы можете использовать эту команду POSIX awk:

awk '{for (i=1; i<=NF; i++) ++freq[$i]} END{for (i in freq) print i, freq[i]}' file
1 голос
/ 31 марта 2020

Вы также можете использовать границы слов в вашем шаблоне:

for n in {1..56}
do
   echo $n >> barchart.txt
   grep -o -i "\b$n\b" text_file.txt | wc -l >> barchart.txt
done
0 голосов
/ 31 марта 2020

Вы можете использовать -w для соответствия регулярному выражению слова:

   grep -o -w $n text_file.txt | wc -l >> barchart.txt

Вы можете сопоставлять пустые строки в начале числа (\<) и в конце числа ( \>):

    grep -o '\<'$n'\>' text_file.txt | wc -l >> barchart.txt

Вам не нужно -i для сопоставления без учета регистра, поскольку вы сопоставляете только цифры.

...