如何从多个文件中grep / count不同的值

时间:2016-04-01 19:33:15

标签: regex command-line 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

如何确定每个键在所有文件中是否都有不同的值?以及如何grep和计算所有文件中的所有不同值?

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

2 个答案:

答案 0 :(得分: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也存在。 管道到

... | 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

答案 1 :(得分: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