我有以下檔案(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 回圈來查找在上述檔案的一行中一起出現的所有可能的名稱對。
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 回圈的輸出如下:
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 回圈中添加一個計數器,但到目前為止我還不能正確地做到這一點。
uj5u.com熱心網友回復:
使用 OP 的 11 行示例作為我們的輸入:
$ 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 的當前代碼進行一些調整以跟蹤計數,然后按計數排序輸出,然后按名稱排序:
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
筆記:
- 假設我們有足夠的記憶體用于 3 維陣列;然后又...
- 這些 2-/3 維陣列的記憶體使用量應該明顯小于使用 1 維陣列的復合索引的其他答案,即...
[bob][smith]并且[bob][jones]需要bob在記憶體中存盤一??次,而[bob,smith]并且[bob,jones]需要bob在記憶體中存盤兩次- OP 的預期輸出混合了輸出分隔符;使用
OFS=" , "與 OP 之前的編輯相匹配;OP可以OFS根據需要修改
這將生成以下 61 行輸出:
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{...}可以將塊簡化為以下內容:
END { for (i in k)
for (j in k[i])
print i,j,k[i][j]
}
uj5u.com熱心網友回復:
找到所有可能的名字對一起出現他們的計數
您可以使用此awk解決方案:
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
uj5u.com熱心網友回復:
使用一個合理的示例輸入檔案,這樣我們就可以一眼看出腳本是否有效,因為預期的輸出很明顯:
$ cat file
a,b,c
c,a
e,d
這將使用任何 awk 執行您想要的操作:
$ 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]
}
}
$ awk -f tst.awk file
a,b,1
a,c,2
d,e,1
b,c,1
或者如果你想要它排序:
$ awk -f tst.awk file | sort
a,b,1
a,c,2
b,c,1
d,e,1
使用 OP 提供的示例輸入:
$ 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
我們有:
$ 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/492634.html
