2016-04-01 8 views
0

Ich habe mehrere Dateien, die Schlüssel/WertWie grep/verschiedene Werte aus mehreren Dateien zählen

Datei # 1:

key1: 1 
key2: 2 
key3: 3 
key4: 4 

Datei # 2:

key1: 1 
key2: 23 
key3: 23 
key4: 4 

# Datei 3:

key1: 20 
key2: 223 
key3: 213 
key4: 0 

Wie kann ich herausfinden, ob ea ch-Taste hat einen eindeutigen Wert in allen Dateien? Und wie man alle unterschiedlichen Werte von allen Dateien grep und zählt?

Expected outputs: 
key name : count 
key1: 2 
key2: 3 
key3: 3 
key4: 2 
+0

Zum Beispiel habe ich will wissen, key1 hat zwei verschiedene Werte (1 und 20) und möchte auch wissen für den Wert 1, wie viele Dateien diesen Wert teilen (in diesem Beispiel ist es 2 seit Datei 1 und Datei 2 teilen den gleichen Wert), während Datei 3 einen anderen Wert hat 20 –

+0

Bitte fügen Sie Ihre gewünschte Ausgabe für diese Beispieleingabe zu Ihrer Frage hinzu. – Cyrus

Antwort

1
$ cat file{1,2,3} | sort -k1,1 -k2n | uniq -c 

     2 key1: 1 
     1 key1: 20 
     1 key2: 2 
     1 key2: 23 
     1 key2: 223 
     1 key3: 3 
     1 key3: 23 
     1 key3: 213 
     1 key4: 0 
     2 key4: 4 

werden Sie geben, dass key: 1 erscheint zweimal und key1: 20 existiert auch. Rohr

... | awk '$1>1' 

    2 key1: 1 
    2 key4: 4 

gibt Ihnen, dass zwei Tasten Werte dupliziert haben. Oder alle in awk

$ awk '{a[$0]++} 
    END{for(k in a) if(a[k]>1) print a[k], k}' file{1,2,3} 

2 key1: 1 
2 key4: 4 

können Sie Eingabe in irgendeiner Weise bash angeben können zur Liste der Dateien erweitern, zum Beispiel dir/*.txt tun wird.

Nun, die Frage hat sich geändert! Nun ist es das, was Sie

$ cat file{1,2,3} | sort -k1,1 -k2n | uniq -c | 
    awk '{print $2}'| uniq -c | 
    awk 'BEGIN{print "keyword","count"} {print $2,$1}' 

keyword count 
key1: 2 
key2: 3 
key3: 3 
key4: 2 

oder, alle in einem einzigen awk

$ awk '{a[$0]++} 
    END{print "keyname", "count"; 
     for(k in a) {split(k,b," ") c[b[1]]++} 
     for(k in c) {print k, c[k]}}' file{1,2,3} 

keyname count 
key3: 3 
key4: 2 
key1: 2 
key2: 3 
+0

Danke! Ist es möglich, die Dateinamen nicht explizit anzugeben, sondern stattdessen das Verzeichnis? –

+0

Vielen Dank !! Funktioniert perfekt! –

0
for key in `awk -F ":" '{print $1 }' file1`;do grep key <file1> <file2> <file3> |sort -n | uniq|wc -l;done 

wollen, wenn Sie alle distict zusammenzufassen wollen Werte

for key in `awk -F ":" '{print $1 }' file1`;do grep key <file1> <file2> <file3> |awk -F ":" '{sum+=$2}END{print sum}';done 
Verwandte Themen