从bash

时间:2016-11-21 17:01:11

标签: bash unix

我有两个csv文件

档案A

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来计算它们中的每一个。任何想法都会有所帮助。

提前致谢!

2 个答案:

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

答案 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之前,您可以将1替换为Count并将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 代替这样:

Caller

输出就像上面一样。