我有以下文件(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
我使用下面的awk循环来查找所有可能的名称对,这些名称对一起出现在上述文件的一行中。Zhichen Gong , Huanhuan Chen, 1
此awk循环的输出如下:
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输出,我希望它像这样:
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
其中,第一行(Zhichen Gong , Huanhuan Chen, 1
)中的1表示这对名称在初始文件中出现了1次。
我假设我只需要在awk循环中添加一个计数器,但是到目前为止我还不能正确地完成它。
3条答案
按热度按时间gblwokeq1#
使用OP的11行样本作为我们的输入:
对OP的当前代码进行一些调整,以跟踪计数,然后首先按计数然后按名称对输出进行排序:
备注:
[bob][smith]
和[bob][jones]
将要求bob
在存储器中存储一次,而[bob,smith]
和[bob,jones]
将要求bob
在存储器中存储两次OFS=" , "
的使用与OP的早期编辑相匹配; OP可以根据需要修改OFS
这将生成以下61行的输出:
如果输出的顺序无关紧要,则
END{...}
块可以简化为:kx5bkwkv2#
查找与其计数一起出现的所有可能的名称对
您可以使用此
awk
解决方案:v6ylcynt3#
使用一个合理的示例输入文件,这样我们就可以一眼看出脚本是否工作,因为预期的输出是显而易见的:
这将使用任何awk执行您想要的操作:
或者,如果您要排序它:
通过OP提供的样本输入:
我们有: