web-dev-qa-db-de.com

Wie kann ich die Anzahl der wiederholten Nummern in einer Datei zählen und diese dann nach Wiederholungen ordnen?

Ich habe eine Datei, die eine Anzahl von Wiederholungen organisiert werden muss. Meine Datei hat 6 Zeilen und 3120 Zeilen. Jedes Mitglied hat 1 oder 2 Ziffern, insgesamt 18720 Ziffern mit einer oder 2 Ziffern.

Ich möchte zählen, wieviele 1, wieviele 2, wieviele 3 usw. bis wieviele 45 ich in meiner Akte habe und organisiere die am häufigsten gemeldete Zahl bis weniger wiederholt ausgeben. Beispiel:

5   7   13  25  26  44
12  21  26  28  32  44
10  20  22  26  40  44
13  18  19  20  22  23
9   15  17  19  22  43
10  19  28  29  37  45
2   8   12  13  22  35
3   23  24  26  38  39
3   14  19  20  33  43
2   3   8   35  36  43
2   8   25  29  37  43
3   24  27  29  38  44
5   20  23  32  33  40
11  17  22  26  33  36
1   6   31  32  39  44
4   22  27  31  36  43
3   6   18  22  35  44
11  13  24  28  32  33
17  22  27  29  42  44
8   9   16  23  29  44
13  19  20  33  37  40
18  21  29  31  34  44
14  15  20  31  32  41
6   32  33  40  41  43
11  17  18  31  43  44
1   9   10  22  24  34
6   8   9   35  37  38
14  18  21  36  40  43
11  16  17  32  34  38
1   5   14  22  23  24
5   19  21  22  32  45
12  17  20  22  32  44
9   27  32  38  42  44
4   12  16  26  42  45
6   7   8   16  39  42
5   6   13  18  27  28

Ausgabe:

die meisten werden zuerst mit der Anzahl der Wiederholungen wiederholt

5 = 30 Fünf Mal geerntet

4 = 28 Vier Mal geerntet

.........

.........

.........

35 = 0 Fünfunddreißig 0-mal wiederholt

Ich versuche dies, aber es funktioniert nicht und ich bin kein Experte, um Code zu ändern

$ tr -s " " "\n" | sort | uniq -c | sort -n r | awk '{print $2 " = " $1}'
$ awk -v RS='\\s+' '{cnt[$0]++} END{PROCINFO["sorted_in"]="@val_num_desc"; for (i in cnt) print i" = "cnt[i]}' file
$ tr -s ' ' '\n' <file | sort | uniq -c | sort -nr | awk '{print $2 " = " $1}'
$ tr -s ' ' '\n' <nums | sort | uniq -c | sort -k1,1nr -k2n | awk '{print $2 " = " $1}'
$ awk -v RS=" +|\n" '{a[$1]++}END{for(x in a)printf "%d = %d\n",x,a[x]}' file
$ awk -v RS=" +|\n" '{a[$1]++}END{for(x in a)printf "%d = %d\n",x,a[x]}' f|sort -nr -k3
4
John

Du kannst tun:

tr -s ' ' <file.txt | tr ' ' '\n' | sort -n | uniq -c | sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
  • tr -s ' ' macht aufeinanderfolgende Leerzeichen zu einem

  • tr ' ' '\n' wandelt Leerzeichen in Zeilenumbrüche um

  • sort -n führt eine numerische sort- Eingabe durch

  • uniq -c zählt

  • sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/' formatiert die Ausgabe wie gewünscht.

Beispiel:

$ tr -s ' ' <file.txt | tr ' ' '\n' | sort -n | uniq -c | sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
12=44
12=22
10=32
8=43
7=20
6=33
6=29
6=26
6=19
6=18
6=17
6=13
6=8
6=6
5=40
5=38
5=31
5=27
5=24
5=23
5=9
5=5
5=3
4=42
4=37
4=36
4=35
4=28
4=21
4=16
4=14
4=12
4=11
3=45
3=39
3=34
3=10
3=2
3=1
2=41
2=25
2=15
2=7
2=4
6
heemayl

Dies ergibt die Anzahl der Vorkommen einer Zahl, sortiert in absteigender Reihenfolge nach der Anzahl der Vorkommen:

_$ awk '{for (i=1;i<=NF;i++) a[$i]++;} END{for (i in a)print i"="a[i]}' file | sort -rnt= -k2,2
44=12
22=12
32=10
43=8
20=7
8=6
6=6
33=6
29=6
26=6
19=6
18=6
17=6
13=6
[...snip...]
_

Oben bedeutet _44=12_, dass _44_ _12_ mal wiederholt wurde.

GNU awk

Wenn Sie GNU awk (gawk) installiert haben, können Sie die Notwendigkeit einer Pipeline beseitigen und alles in einer awk-Anweisung erledigen:

_awk 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"} {for (i=1;i<=NF;i++) a[$i]++;} END{for (i in a)print i"="a[i]}' file
_
6
John1024

Nur eine AWK-Variante (Ich habe AWK schon lange nicht mehr ...)

awk -v RS="[ \n]+" '{a[$1]++} END{ for(b in a){print b,a[b] | "sort -rnk2,2"}}'
0
user216043