2016-11-21 52 views
1

我有兩個CSV文件計數模式

文件

ID 
1 
2 
3 

文件B

ID 
1 
1 
1 
1 
3 
2 
3 

我想要做的是算文件A中的ID出現在文件B中多少次,然後將結果保存在新的文件C中(格式爲csv)。例如,1文件所以在新文件中的C顯示了在文件B. 4次,我應該有類似

File C 
ID,Count 
1,4 
2,1 
3,2 

本來我想用的「grep -f」,但現在看來似乎只適用於.txt格式。不幸的是,文件A和B都是csv格式。所以現在,我想也許我可以使用for循環來單獨獲取文件A中的ID,並使用grep -c來計算它們中的每一個。任何想法都會有所幫助。

在此先感謝!

回答

1

您可以使用此awk命令:

awk -v OFS=, 'FNR==1{next} FNR==NR{a[$1]; next} $1 in a{freq[$1]++} 
       END{print "ID", "Count"; for (i in freq) print i, freq[i]}' fileA fileB 

ID,Count 
1,4 
2,1 
3,2 
+0

優秀的答案!它做了這項工作。但是想知道{freq [$ 1] ++}中的$ 1是做什麼的?特別是什麼?這是一個列表或什麼? –

+1

'a'是一個關聯數組,它由'fileA'中的'id'填充。然後,'1中的$ 1檢查數組'a'中是否存在'fileB'中的'$ 1'。如果它確實存在,那麼填充並增加另一個數組'freq' – anubhava

+1

,這樣它們就是自定義數組。非常感謝! –

0

你可以使用joinsortuniq進程替換<(command)創造性:

$ join -2 2 <(sort A) <(sort B | uniq -c) | sort -n > C 
$ cat C 
ID 1 
1 4 
2 1 
3 2 

如果你真的想要的頭爲ID Count,在寫入文件C之前,您可以用代替與sed加入:

... | sed 's/\(ID \)1/\1Count/' > C 

得到

ID Count 
1 4 
2 1 
3 2 

,如果你真的想逗號作爲分隔符代替空格,用tr空格來代替它們,還可以添加:

... | tr \ , > C 

得到

ID,Count 
1,4 
2,1 
3,2 

你當然可以溝tr並使用sed這樣,而不是:

... | sed 's/\(ID \)1/\1Count/;s/ /,/' > C 

和輸出會是什麼樣以上。