从bash中的另一个csv文件中计算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对
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