
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
Tengo un archivo como se muestra pero a mayor escala. Mi objetivo es generar la cantidad de 111, 1, 11, 1111, etc. están en el archivo. He visto muchas publicaciones hablando de hacer:
grep "\^word\" text_file
grep "\bword\b" text_file
grep -Fx "word" text_file
and so on...
Todos ellos no han generado nada o han generado el archivo completo. ¿Qué debo hacer para enumerar solo ciertos números?
Respuesta1
Usando tr
, sort
y uniq
:
$ tr -s ' ' '\n' <file | sort | uniq -c
1
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
Esto también le proporciona un recuento de una línea vacía (la primera línea en el resultado anterior), pero puede evitarlo con sed
:
$ tr -s ' ' '\n' <file | sed '/^$/d' | sort | uniq -c
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
La canalización cambia todos los espacios a nuevas líneas, ordena las líneas resultantes y cuenta el número de apariciones de cada línea.
Respuesta2
No usaría grep para este sino con 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 demostración de una sola línea debería funcionar con todo el archivo (reemplazar <<<"$a"
con yourfile
)