2016-04-01 28 views
0

我有鑰匙多個文件/值如何用grep /從多個文件數不同的值

文件#1:

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

文件#2:

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

文件# 3:

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

我怎樣才能知道ea ch key在所有文件中都有明確的值?以及如何grep和統計所有文件中的所有不同值?

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

例如,我想知道key1有兩個不同的值(1和20),也想知道值1,有多少文件共享此值(在本例中,它是2,因爲文件1並且文件2共享相同的值),而文件#3具有不同的值20 –

+0

請將您希望的輸出樣本輸入添加到您的問題中。 – Cyrus

回答

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 

會給你key: 1出現兩次及key1: 20存在過。 pipe to

... | awk '$1>1' 

    2 key1: 1 
    2 key4: 4 

給你兩個鍵有重複的值。或全部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 

您可以指定任何方式的bash輸入可擴展到文件列表,例如dir/*.txt會做。

好吧,問題改變了!現在,這是你想要

$ 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 

,或者在一個單一的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

謝謝!是否有可能不明確包含文件名稱,但目錄呢? –

+0

非常感謝!完美的作品! –

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

如果你想總結一下所有DISTICT值

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