
11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1
Eu tenho um arquivo como mostrado, mas em uma escala maior. Meu objetivo é produzir a quantidade de 111s, 1s, 11s, 1111s, etc. estão no arquivo. Vi muitos posts falando sobre fazer:
grep "\^word\" text_file
grep "\bword\b" text_file
grep -Fx "word" text_file
and so on...
Todos eles não geraram nada ou o arquivo inteiro. O que devo fazer para listar apenas alguns números?
Responder1
Usando tr
, sort
e uniq
:
$ tr -s ' ' '\n' <file | sort | uniq -c
1
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
Isso também fornece uma contagem de linhas vazias (a primeira linha na saída acima), mas você pode evitar isso com sed
:
$ tr -s ' ' '\n' <file | sed '/^$/d' | sort | uniq -c
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
O pipeline altera todos os espaços para novas linhas, classifica as linhas resultantes e conta o número de ocorrências de cada linha.
Responder2
Eu não usaria grep para este, mas com awk:
$ a="11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1"
$ awk '{for (i=1;i<=NF;i++) ++seen[$i]}END{for (k in seen) print k,"found:"seen[k]}' <<<"$a"
1 found:17
11 found:5
111 found:1
11111 found:2
1111111 found:1
11111111 found:1
Esta demonstração de linha única deve funcionar com todo o seu arquivo (substitua <<<"$a"
por yourfile
)