Anzahl exakter Zeichenfolgen in einer Datei auflisten

Anzahl exakter Zeichenfolgen in einer Datei auflisten
  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 

Ich habe eine Datei wie gezeigt, aber in größerem Maßstab. Mein Ziel ist es, die Anzahl der 111er, 1er, 11er, 1111er usw. auszugeben, die in der Datei enthalten sind. Ich habe viele Beiträge gesehen, in denen davon die Rede ist:

grep "\^word\" text_file
grep "\bword\b" text_file
grep -Fx "word" text_file
and so on...

Alle diese haben entweder nichts oder die gesamte Datei ausgegeben. Was soll ich tun, um nur bestimmte Zahlen aufzulisten?

Antwort1

Verwenden von tr, sortund uniq:

$ tr -s ' ' '\n' <file | sort | uniq -c
   1
  17 1
   5 11
   1 111
   2 11111
   1 1111111
   1 11111111

Dadurch erhalten Sie auch die Anzahl für eine leere Zeile (die erste Zeile in der Ausgabe oben), aber Sie können dies mit folgendem vermeiden sed:

$ tr -s ' ' '\n' <file | sed '/^$/d' | sort | uniq -c
  17 1
   5 11
   1 111
   2 11111
   1 1111111
   1 11111111

Die Pipeline ändert alle Leerzeichen in Zeilenumbrüche, sortiert die resultierenden Zeilen und zählt die Anzahl der Vorkommen jeder Zeile.

Antwort2

Ich würde hierfür nicht grep verwenden, sondern 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

Diese einzeilige Demo sollte mit Ihrer gesamten Datei funktionieren (ersetzen <<<"$a"durch yourfile)

verwandte Informationen