2017-06-20 4 views
1

Ich habe eine Frage bezüglich meiner zuvor erfolgreich beantwortete Frage here von @fedorgui.Statistik mit awk berechnen

Ich habe eine Tabelle:

pac1 xxx 
pac1 yyy 
pac1 zzz 
pac2 xxx 
pac2 uuu 
pac3 zzz 
pac3 uuu 
pac4 zzz 

Und ich brauche Ausgabe wie folgt zu berechnen:

pac1 xxx 2/4 
pac1 yyy 1/4 
pac1 zzz 3/4 
pac2 xxx 2/4 
pac2 uuu 2/4 
pac3 zzz 2/4 
pac3 uuu 2/4 
pac4 zzz 3/4 

Wo erste Zahl ist einzigartig Vorkommen in der zweiten Spalte/einzigartige Vorkommen in der ersten Spalte (in diesem Fall xxx tritt 2 in Spalte zwei und uniq Spalte eins ist 4 => 2/4

Lösung funktioniert in Awk ist hier:

$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file 

Aber meine Eingabezeilen dupliziert haben könnte wie:

pac1 xxx 
pac1 xxx 
pac1 xxx 
pac1 yyy 
pac1 zzz 
pac2 xxx 
pac2 xxx 
pac2 xxx 
pac2 uuu 
pac3 zzz 
pac3 uuu 
pac4 zzz 
pac4 zzz 

Und ich brauche die gleichen Berechnungen zu tun, sondern nur für uniq Zeilen und fügen diese Statistik zu allen Zeilen wie (nicht Vervielfältigungen Zeilen berechnen) :

pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 yyy 1/4 
pac1 zzz 3/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 uuu 2/4 
pac3 zzz 2/4 
pac3 uuu 2/4 
pac4 zzz 3/4 
pac4 zzz 3/4 

Dies ist komplizierter Ich habe Tausende von Zeilen. Danke für jede Idee.

+0

Zahlen und Berechnung sind die gleichen wie Beispiel 1 - ich Berechnung tun müssen, wie : uniq Geroge

+1

probiere 'FNR == NR {if (! Gesehen [$ 0] ++) {col1 [$ 1] ++; col2 [$ 2] ++;} next} '(aber du musst extra Leerzeichen am Zeilenende entfernen) ... sonst probier 'if (! seen [$ 1 $ 2] ++)' – Sundeep

+0

Das habe ich versucht, aber Problem ist, dass dies ein Teil der Datei ist - ich habe viel mehr Spalten, die nicht eindeutig sind, also muss ich uniq nur für diese zwei Spalten überprüfen. – Geroge

Antwort

5

Überprüfen Sie, ob die Zeile beim Hinzufügen zum zweiten Array eindeutig ist.

awk 'FNR==NR{a[$1];b[$2]+=!c[$1,$2]++;next}{print $0, b[$2] "/" length(a)}' test{,} 

pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 xxx 2/4 
pac1 yyy 1/4 
pac1 zzz 3/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 xxx 2/4 
pac2 uuu 2/4 
pac3 zzz 3/4 
pac3 uuu 2/4 
pac4 zzz 3/4 
pac4 zzz 3/4 

oder wenn es nicht zufällig Leerzeichen am Ende von Zeilen wie Ihr Beispiel sind könnten Sie einfach $0 anstelle von $1,$2

+0

Vielen Dank, ich werde es testen - ich kann benutze $ 0 nicht, weil ich viel mehr Spalten habe, die nicht eindeutig sind. – Geroge