shell 计算文件间的匹配项[已关闭]

wmomyfyw  于 2023-02-19  发布在  Shell
关注(0)|答案(1)|浏览(100)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

5天前关闭。
Improve this question
我遇到了一个与awk相关的问题,无法计算匹配的出现次数。我有一个包含ID(数字和/或字符)列表的文件,以及另一个包含另一个ID的文件,其中第二列包含第一个ID的集合:
文件一:

| ID1 |
| --- |
|   1 |
|   2 |
|   5 |
|   7 |

档案二:

| ID2 | ID1_collection |
| -------- | -------- |
| 1 | 1,2,3 |
| 2 | 1 |
| 3 | 4 |
| 4 |  |
| 5 | 5 |
| 6 |  |

包含集合的列不需要填充或匹配第一个文件中的任何ID。目标是这样一个文件:

| ID2 | ID1_collection | count |
| -------- | -------- | -------- |
| 1 | 1,2,3 | 2
| 2 | 1 | 1
| 3 | 4 | 0
| 4 |  | 0
| 5 | 5 | 1
| 6 |  | 0

但是,我无法考虑一个逻辑,该逻辑贯穿文件1和count的整个列,使用awk脚本时,这些ID中有多少出现在集合中。
我想我可以创建一个包含所有ID1值的数组,并在列内的分隔符处拆分ID1_collection中的每个字符串(全局分隔符是"|")到grep中查找精确匹配。但是我不能弄清楚a)这会有多高效(我想不是真的)和b)如何以合理的方式编写语法...
任何帮助都将不胜感激

2jcobegt

2jcobegt1#

使用awk的方法

% awk 'NR == FNR{x++; arr[$1]++; next} 
       FNR == 1{print $0, "count"; next} 
       {n = split($2, a, ",")
        for(i in arr){
          for(j=1; j<=n; j++){
            if(i == a[j]){ y++ }}} 
          print $0, y; y = 0}' file1 file2
ID2 ID1_collection count
1 1,2,3 2
2 1 1
3 4 0
4 "" 0
5 5 1
6 "" 0
数据
% cat file1 file2
ID1
1
2
5
7
ID2 ID1_collection
1 1,2,3
2 1
3 4
4 ""
5 5
6 ""

相关问题