2016-07-19 11 views
1

sagen, dass ich eine Datei mit drei Spalten haben, wie folgt:Wie kann man den Inhalt einer Spalte mit awk um zwei andere zählen?

awk zu verwenden
00:00:01 Login  Steve 
00:00:01 Install Sarah 
00:00:01 Install Sarah 
00:00:02 Explorer Sarah 
00:00:02 Explorer Sarah 
00:00:02 Install Steve 
00:00:02 Firewall Sarah 
00:00:02 Logout Steve 
00:00:04 Logout Sarah 

Ist es möglich, die einzigartigen Aktionen jeder Benutzer in jedem Zeitstempel führt zu zählen, so ist die Ausgabe etwas wie folgt aus:

00:00:01 Steve Login 1 
00:00:01 Sarah Install 2 
00:00:02 Sarah Explorer 2 
00:00:02 Steve Install 1 
00:00:02 Sarah Firewall 1 
00:00:02 Steve Logout 
00:00:04 Sarah Logout 

Dies ist die nächste, die ich gekommen bin:

awk '{count[$1,$3,$2]++}END{for (i in count){split(i,a,SUBSEP); print a[1],a[2],count[i]}}' awktest.txt 

Was mir dieses Ergebnis geben:

00:00:02 Sarah 1 
00:00:02 Steve 1 
00:00:02 Steve 1 
00:00:01 Steve 1 
00:00:04 Sarah 1 
00:00:02 Sarah 2 
00:00:01 Sarah 1 
00:00:01 Sarah 1 

Ich mache das in Cygwin.

+1

Warum haben die letzten zwei Zeilen Ihrer gewünschten Ausgabe keine Anzahl? – jas

+1

Was ist deine eigentliche Frage? Sie geben das Problem an und was Sie getan haben, um es zu lösen. –

+1

Sie haben also Code geschrieben, der 2 der 3 Indizes des Arrays ausgibt, und 1 der 3 Indizes fehlt in der Ausgabe. Was könnte das Problem sein .... –

Antwort

0
$ awk -F"\t" -v OFS="\t" '{arr[$0]+=1} END {for(i in arr) print i,arr[i]}' test.in 
00:00:01  Install Sarah 2 
00:00:04  Logout Sarah 1 
00:00:02  Firewall  Sarah 1 
00:00:01  Login Steve 1 
00:00:02  Logout Steve 1 
00:00:02  Install Steve 1 
00:00:02  Explorer  Sarah 2 
+0

Das hat perfekt funktioniert, danke! Da bin ich ziemlich neu ** bis ** – SVill

+0

Das hat perfekt funktioniert, danke! Da ich awk ziemlich neu bin, habe ich über Ihre Aussage nachgesehen, ob ich verstehen könnte, wie jeder Teil funktioniert. Ist das eine genaue Bewertung? '-F" \ t "': setzt das Feldtrennzeichen als Tabulator. '-v': übergeben Variablen an Skript. 'OFS =" \ t "': setzt das Ausgabeparameterfeld auf die Registerkarte. '{arr [$ 0] + = 1}': Betrachte die aktuelle Zeile und addiere 1 zu ihrem Wert ech time es auftritt. 'END': Ausführen der letzten Aktionen des Skripts. '{für (i in arr) drucke ich, arr [1]}': Für die Variable i im Array, drucke den Wert von i, wobei arr eine Funktion von i ist. – SVill

+0

'arr [$ 0] + = 1': Verwenden Sie den aktuellen Datensatz' $ 0' als Schlüssel für das Array 'arr' und akkumulieren Sie den Wert dieses Array-Elements um eins. 'für (i in arr) drucke i, arr [1]}': für jedes Array 'arr' Element drucke seinen Schlüssel und Wert. –