J'ai un fichier qui a besoin d'organiser un certain nombre de répétitions, mon fichier a 6 lignes et 3120 lignes, chaque membre a 1 ou 2 chiffres, total 18720 numéros avec un ou 2 chiffres.
Je voudrais compter combien de 1, combien de 2, combien de 3, ainsi de suite à combien de 45 j'ai dans mon dossier et sortie organanize le nombre le plus rapporté à moins répété. Exemple:
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
Sortie:
le plus répété en premier avec le nombre de répétitions
5 = 30 Cinq récoltés 30 fois
4 = 28 Quatre récolté 28 fois
.........
.........
.........
35 = 0 Trente-cinq répétées 0 fois
J'essaye cela mais ne fonctionne pas et je ne suis pas un expert pour changer de code
$ 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
Tu peux faire:
tr -s ' ' <file.txt | tr ' ' '\n' | sort -n | uniq -c | sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
tr -s ' '
fera des espaces successifs en un
tr ' ' '\n'
convertira les espaces en nouvelles lignes
sort -n
fera numérique sort
- ing
uniq -c
fera le décompte
sort -k1,1rn -k2,2rn | sed 's/^ \+//; s/ /=/'
formatera la sortie comme vous le souhaitez.
Exemple:
$ 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
Ceci produit le nombre d'occurrences d'un nombre, triées par ordre décroissant par nombre d'occurrences:
$ 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...]
Dans ce qui précède, 44=12
signifie que 44
a été répété 12
fois.
Si vous avez GNU awk (gawk) installé, vous pouvez éliminer le besoin d'un pipeline et tout faire en une seule déclaration awk:
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
Juste une variante AWK (je n'ai pas AWK depuis longtemps ...)
awk -v RS="[ \n]+" '{a[$1]++} END{ for(b in a){print b,a[b] | "sort -rnk2,2"}}'