Ich habe eine Datei, die ungefähr Folgendes enthält:
red dog
red cat
red bird
red horse
blue hamster
blue monkey
blue lion
pink pony
pink whale
pink pig
pink dolphin
Ich muss für jede Farbe und dann für jedes Tier einen Zähler erhöhen. Rot wäre also 1, Blau 2, Rosa 3. Als nächstes wären Hund, Katze, Vogel und Pferd 1, 2, 3 und 4. Der Hamster muss wieder bei 1 beginnen, weil wir mit einer neuen Farbe beginnen.
Wenn ich für die besagte Datei ein „while read color animal“ ausführe, was kann ich zum Vergleichen tun, wenn die Farbe nicht mehr der vorherigen Farbe entspricht?
Ich suche so etwas:
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
Ich bin für alle Vorschläge sehr dankbar :)
Antwort1
So etwas mit awk
:
$ awk '$1 != c { cc++; c=$1; ac=0; a="" } $2 != a { ac++; a=$2 } { printf("%d.%d\n", cc, ac) }' file
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
Das awk
Skript verfolgt vier Dinge:
- Der zuletzt gelesene Tiername,
a
. - Die zuletzt gelesene Farbe,
c
. - Der „Tierzähler“,
ac
. - Der „Farbzähler“,
cc
.
Es aktualisiert diese Variablen abhängig von den Ergebnissen in den beiden Eingabespalten.
- Wenn die Farbe nicht mit der zuletzt gelesenen übereinstimmt, erhöhen
cc
und merkenDasFarbe stattdessen. Auch zurücksetzenac
unda
. - Wenn das Tier nicht mit dem zuletzt gelesenen übereinstimmt, erhöhen
ac
und merkenDasTier stattdessen.
Drucken Sie dann cc
und ac
für jede Eingabezeile.
Wenn garantiert wäre, dass die Tiere in jeder Zeile eindeutig sind, könnte man die Variable weglassen a
.
Antwort2
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
Der Hash %h
enthält keyA => count
und scalar keys %h
gibt die Anzahl der Schlüssel zu jedem Zeitpunkt zurück. Dann kehren wir das Ergebnis um und verbinden sie mit einem Komma.
Ergebnis
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4