Ergebnis

Ergebnis

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 awkSkript verfolgt vier Dinge:

  1. Der zuletzt gelesene Tiername, a.
  2. Die zuletzt gelesene Farbe, c.
  3. Der „Tierzähler“, ac.
  4. 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 ccund merkenDasFarbe stattdessen. Auch zurücksetzen acund a.
  • Wenn das Tier nicht mit dem zuletzt gelesenen übereinstimmt, erhöhen acund merkenDasTier stattdessen.

Drucken Sie dann ccund acfü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 %henthält keyA => countund scalar keys %hgibt 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

verwandte Informationen