从bash中的另一个csv文件中计算csv文件中的模式

从bash中的另一个csv文件中计算csv文件中的模式,bash,unix,Bash,Unix,我有两个csv文件 归档 ID 1 2 3 文件B ID 1 1 1 1 3 2 3 我想做的是计算文件a中的ID显示在文件B中的次数,并将结果保存在新文件C(csv格式)中。例如,文件A中的1在文件B中显示了4次。因此在新的文件C中,我应该有如下内容 File C ID,Count 1,4 2,1 3,2 最初我想使用“grep-f”,但它似乎只适用于.txt格式。不幸的是,文件A和B都是csv格式。所以现在,我在想,也许我可以使用for循环从文件a中单独获取ID,然后使用grep-c对

我有两个csv文件

归档

ID
1
2
3
文件B

ID
1
1
1
1
3
2
3
我想做的是计算文件a中的ID显示在文件B中的次数,并将结果保存在新文件C(csv格式)中。例如,文件A中的1在文件B中显示了4次。因此在新的文件C中,我应该有如下内容

File C
ID,Count
1,4
2,1
3,2
最初我想使用“grep-f”,但它似乎只适用于.txt格式。不幸的是,文件A和B都是csv格式。所以现在,我在想,也许我可以使用for循环从文件a中单独获取ID,然后使用grep-c对每个ID进行计数。任何想法都会有帮助


提前谢谢

您可以使用此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

您可以使用
join
sort
uniq
和process substitution
非常好的答案!它成功了。但是想知道{freq[$1]+}中的$1做什么?特别是,什么是一个?那是一个列表还是什么?
a
是一个关联数组,由
fileA
中的
id
填充。然后a中的
$1
检查
文件B中的
$1
是否存在于数组
a
中。如果确实存在,则填充并增加另一个数组
freq
,使其成为自定义数组。非常感谢你!
$ join -2 2 <(sort A) <(sort B | uniq -c) | sort -n > C
$ cat C
ID 1
1 4
2 1
3 2
... | sed 's/\(ID \)1/\1Count/' > C
ID Count
1 4
2 1
3 2
... | tr \  , > C
ID,Count
1,4
2,1
3,2
... | sed 's/\(ID \)1/\1Count/;s/ /,/' > C