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
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
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.
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
_
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"}}'