首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列出出现在一行中的所有名称对,并计算它们的频率。

列出出现在一行中的所有名称对,并计算它们的频率。
EN

Stack Overflow用户
提问于 2022-06-17 18:44:18
回答 3查看 88关注 0票数 -2

我有以下文件(2016.csv,文件的头如下所示)

代码语言:javascript
运行
复制
Zhichen Gong,Huanhuan Chen
Zhichuan Huang,Tiantian Xie,Ting Zhu,Jianwu Wang,Qingquan Zhang
Zhichuan Huang,Ting Zhu
Zhifei Zhang,Yang Song,Wei Wang 0063,Hairong Qi

我使用下面的awk循环来查找所有可能出现在上面文件一行中的名字。

awk -F, '{for(i=1;i<NF;i++){for(j=i+1;j<=NF;j++){if($i > $j){k[$i][$j]}else{k[$j][$i]}}}}END{for(n in k){for (l in k[n]){print n,",",l}}}' 2016.csv

这个awk循环的输出如下:

代码语言:javascript
运行
复制
Zhichen Gong , Huanhuan Chen 
Zhichuan Huang , Tiantian Xie
Zhichuan Huang , Ting Zhu
Zhichuan Huang , Jianwu Wang
Zhichuan Huang , Qingquan Zhang
Zhifei Zhang,Yang Song
Zhifei Zhang,Wei Wang 0063
Zhifei Zhang,Hairong Qi
etc

此循环工作良好,并一起查找出现在初始文件行中的所有对。我只想添加一个计数器,在awk输出的每一行旁边,它将显示这对计数器在初始文件中存在的次数。

例如,对于上面的awk输出,我希望它类似于:

代码语言:javascript
运行
复制
Zhichen Gong , Huanhuan Chen, 1
Zhichuan Huang , Tiantian Xie, 1
Zhichuan Huang , Ting Zhu, 2
Zhichuan Huang , Jianwu Wang, 1
Zhichuan Huang , Qingquan Zhang, 1
Zhifei Zhang,Yang Song, 1
Zhifei Zhang,Wei Wang 0063,1 
Zhifei Zhang,Hairong Qi,1 

其中,第一行中的1 (Zhichen Gong , Huanhuan Chen, 1)显示这对名称在初始文件中存在1次。

我假设我只需要在awk循环中添加一个计数器,但是到目前为止我还不能正确地完成它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-17 20:11:12

使用OP的11行示例作为输入:

代码语言:javascript
运行
复制
$ cat 2016.csv
Zhichen Gong,Huanhuan Chen
Zhichuan Huang,Tiantian Xie,Ting Zhu,Jianwu Wang,Qingquan Zhang
Zhichuan Huang,Ting Zhu
Zhifei Zhang,Yang Song,Wei Wang 0063,Hairong Qi
Zhihao Huang,Hui Li,Xin Li,Wei He
Zhijun Yin,You Chen,Daniel Fabbri,Jimeng Sun,Bradley A. Malin
Zhipeng Huang 0001,Bogdan Cautis,Reynold Cheng,Yudian Zheng
Zhipeng Huang 0001,Yudian Zheng,Reynold Cheng,Yizhou Sun,Nikos Mamoulis,Xiang Li 0067
Zhiqiang Tao,Hongfu Liu,Sheng Li 0001,Yun Fu 0001
Zhiqiang Xu,Yiping Ke
Zhiyuan Chen 0001,Estevam R. Hruschka Jr.,Bing Liu 0001

对OP的当前代码进行一些调整,以跟踪计数,然后根据计数和名称对输出进行排序:

代码语言:javascript
运行
复制
awk '
BEGIN { FS=","; OFS=" , " }
      { for (i=1;i<NF;i++)
            for(j=i+1;j<=NF;j++)
                if   ($i > $j) k[$i][$j]++            # increment counter
                else           k[$j][$i]++            # increment counter
      }
END   { # to sort by count we will create a new 3-dimensional array with the count as the 1st dimension
        for (i in k)
            for (j in k[i]) {
                arr[k[i][j]][i][j]                    # arr[count][i][j]
                delete k[i][j]                        # delete old array entry to limit memory usage
            }
        PROCINFO["sorted_in"]="@ind_num_desc"         # sort 1st index by count/descending
        for (cnt in arr) {
            PROCINFO["sorted_in"]="@ind_str_asc"      # sort 2nd/3rd indices by name/ascending
            for (i in arr[cnt])
                for (j in arr[cnt][i])
                    print i,j,cnt
        }
      }
' 2016.csv

备注:

...

  • [bob][smith]
  • 假设我们有足够的内存存储三维数组;然而,对于这些2/3维数组的
  • 内存使用量应该比使用一维数组复合索引的其他答案小得多,也就是说,bob[bob][jones]将要求bob存储在内存中一次,[bob,smith][bob,jones]将要求bob两次存储在内存中h 216h 117OP的预期输出具有混合的输出分隔符;d18的使用将与OP先前的编辑相匹配;OP可以根据需要修改OFS

这将生成以下61行输出:

代码语言:javascript
运行
复制
Yudian Zheng , Reynold Cheng , 2
Zhichuan Huang , Ting Zhu , 2
Zhipeng Huang 0001 , Reynold Cheng , 2
Zhipeng Huang 0001 , Yudian Zheng , 2
Daniel Fabbri , Bradley A. Malin , 1
Estevam R. Hruschka Jr. , Bing Liu 0001 , 1
Jimeng Sun , Bradley A. Malin , 1
Jimeng Sun , Daniel Fabbri , 1
Qingquan Zhang , Jianwu Wang , 1
Reynold Cheng , Bogdan Cautis , 1
Reynold Cheng , Nikos Mamoulis , 1
Sheng Li 0001 , Hongfu Liu , 1
Tiantian Xie , Jianwu Wang , 1
Tiantian Xie , Qingquan Zhang , 1
Ting Zhu , Jianwu Wang , 1
Ting Zhu , Qingquan Zhang , 1
Ting Zhu , Tiantian Xie , 1
Wei He , Hui Li , 1
Wei Wang 0063 , Hairong Qi , 1
Xiang Li 0067 , Nikos Mamoulis , 1
Xiang Li 0067 , Reynold Cheng , 1
Xin Li , Hui Li , 1
Xin Li , Wei He , 1
Yang Song , Hairong Qi , 1
Yang Song , Wei Wang 0063 , 1
Yizhou Sun , Nikos Mamoulis , 1
Yizhou Sun , Reynold Cheng , 1
Yizhou Sun , Xiang Li 0067 , 1
You Chen , Bradley A. Malin , 1
You Chen , Daniel Fabbri , 1
You Chen , Jimeng Sun , 1
Yudian Zheng , Bogdan Cautis , 1
Yudian Zheng , Nikos Mamoulis , 1
Yudian Zheng , Xiang Li 0067 , 1
Yudian Zheng , Yizhou Sun , 1
Yun Fu 0001 , Hongfu Liu , 1
Yun Fu 0001 , Sheng Li 0001 , 1
Zhichen Gong , Huanhuan Chen , 1
Zhichuan Huang , Jianwu Wang , 1
Zhichuan Huang , Qingquan Zhang , 1
Zhichuan Huang , Tiantian Xie , 1
Zhifei Zhang , Hairong Qi , 1
Zhifei Zhang , Wei Wang 0063 , 1
Zhifei Zhang , Yang Song , 1
Zhihao Huang , Hui Li , 1
Zhihao Huang , Wei He , 1
Zhihao Huang , Xin Li , 1
Zhijun Yin , Bradley A. Malin , 1
Zhijun Yin , Daniel Fabbri , 1
Zhijun Yin , Jimeng Sun , 1
Zhijun Yin , You Chen , 1
Zhipeng Huang 0001 , Bogdan Cautis , 1
Zhipeng Huang 0001 , Nikos Mamoulis , 1
Zhipeng Huang 0001 , Xiang Li 0067 , 1
Zhipeng Huang 0001 , Yizhou Sun , 1
Zhiqiang Tao , Hongfu Liu , 1
Zhiqiang Tao , Sheng Li 0001 , 1
Zhiqiang Tao , Yun Fu 0001 , 1
Zhiqiang Xu , Yiping Ke , 1
Zhiyuan Chen 0001 , Bing Liu 0001 , 1
Zhiyuan Chen 0001 , Estevam R. Hruschka Jr. , 1

如果输出的顺序无关紧要,则可以将END{...}块简化为以下内容:

代码语言:javascript
运行
复制
END   { for (i in k)
            for (j in k[i])
                print i,j,k[i][j]
      }
票数 1
EN

Stack Overflow用户

发布于 2022-06-17 19:10:11

查找所有可能出现在一起的名称,它们的计数

您可以使用此awk解决方案:

代码语言:javascript
运行
复制
awk -F, -v OFS=" , " '
{
   for (i=1; i<NF; i++)
      ++fq[$i OFS $(i+1)]
}
END {
   for (i in fq) print i, fq[i]
}' file
票数 1
EN

Stack Overflow用户

发布于 2022-06-17 21:41:46

使用一个合理的示例输入文件,这样我们就可以一目了然地判断脚本是否有效,因为预期的输出是显而易见的:

代码语言:javascript
运行
复制
$ cat file
a,b,c
c,a
e,d

这可以使用任何awk来做您想做的事情:

代码语言:javascript
运行
复制
$ cat tst.awk
BEGIN { FS=OFS="," }
{
    for (i=1; i<NF; i++) {
        for (j=i+1; j<=NF; j++) {
            cnt[( $i < $j ? $i FS $j : $j FS $i )]++
        }
    }
}
END {
    for ( pair in cnt ) {
        print pair, cnt[pair]
    }
}
代码语言:javascript
运行
复制
$ awk -f tst.awk file
a,b,1
a,c,2
d,e,1
b,c,1

或者如果你想把它分类:

代码语言:javascript
运行
复制
$ awk -f tst.awk file | sort
a,b,1
a,c,2
b,c,1
d,e,1

在提供了OPs示例输入之后:

代码语言:javascript
运行
复制
$ cat file2
Zhichen Gong,Huanhuan Chen
Zhichuan Huang,Tiantian Xie,Ting Zhu,Jianwu Wang,Qingquan Zhang
Zhichuan Huang,Ting Zhu
Zhifei Zhang,Yang Song,Wei Wang 0063,Hairong Qi

我们有:

代码语言:javascript
运行
复制
$ awk -f tst.awk file2 | sort
Hairong Qi,Wei Wang 0063,1
Hairong Qi,Yang Song,1
Hairong Qi,Zhifei Zhang,1
Huanhuan Chen,Zhichen Gong,1
Jianwu Wang,Qingquan Zhang,1
Jianwu Wang,Tiantian Xie,1
Jianwu Wang,Ting Zhu,1
Jianwu Wang,Zhichuan Huang,1
Qingquan Zhang,Tiantian Xie,1
Qingquan Zhang,Ting Zhu,1
Qingquan Zhang,Zhichuan Huang,1
Tiantian Xie,Ting Zhu,1
Tiantian Xie,Zhichuan Huang,1
Ting Zhu,Zhichuan Huang,2
Wei Wang 0063,Yang Song,1
Wei Wang 0063,Zhifei Zhang,1
Yang Song,Zhifei Zhang,1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72663578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档