2013-11-14 43 views
4

我有一個包含兩列數據的文件,我想要計算第一列中出現的相似性。當第一列中的兩個相似條目匹配時,我想也將兩個匹配條目的第二列的值相加。Unix:計算第一列中相似條目的出現次數,總計第二列

實施例列表:

2013-11-13-03 1 
2013-11-13-06 1 
2013-11-13-13 2 
2013-11-13-13 1 
2013-11-13-15 1 
2013-11-13-15 1 
2013-11-13-15 1 
2013-11-13-17 1 
2013-11-13-23 1 
2013-11-14-01 1 
2013-11-14-04 6 
2013-11-14-07 1 
2013-11-14-08 1 
2013-11-14-09 1 
2013-11-14-09 1 

我想輸出到讀類似於以下

2013-11-13-03 1 1 
2013-11-13-06 1 1 
2013-11-13-13 2 3 
2013-11-13-15 3 3 
2013-11-13-17 1 1 
2013-11-13-23 1 1 
2013-11-14-01 1 1 
2013-11-14-04 1 6 
2013-11-14-07 1 1 
2013-11-14-08 1 1 
2013-11-14-09 2 2 

列1是從前面的例子1列匹配的列,第2列是計數與前面的示例中的第1列的匹配(如果沒有其他匹配,則爲1),第3列是來自前面示例中匹配的第1列條目的第2列的總和。任何人有任何提示使用awk或uniq和awk的混合來完成此操作?

回答

5

這裏是一個匆匆與awksort

awk ' 
{ 
    counts[$1]++;  # Increment count of lines. 
    totals[$1] += $2; # Accumulate sum of second column. 
} 
END { 
    # Iterate over all first-column values. 
    for (x in counts) { 
     print x, counts[x], totals[x]; 
    } 
} 
' file.txt | sort 

可以跳過sort,如果你不關心的輸出線的順序。

+0

正是我需要的,謝謝! –

1

這裏純巴什解決方案

$ cat t 
2013-11-13-03 1 
2013-11-13-06 1 
2013-11-13-13 2 
2013-11-13-13 1 
2013-11-13-15 1 
2013-11-13-15 1 
2013-11-13-15 1 
2013-11-13-17 1 
2013-11-13-23 1 
2013-11-14-01 1 
2013-11-14-04 6 
2013-11-14-07 1 
2013-11-14-08 1 
2013-11-14-09 1 
2013-11-14-09 1 
$ declare -A SUM CNT 
$ while read ts vl; do ((SUM[$ts]=+$vl)) ; ((CNT[$ts]++)); done < t 
$ for i in "${!CNT[@]}"; do echo "$i ${CNT[$i]} ${SUM[$i]} "; done | sort 
2013-11-13-03 1 1 
2013-11-13-06 1 1 
2013-11-13-13 2 3 
2013-11-13-15 3 3 
2013-11-13-17 1 1 
2013-11-13-23 1 1 
2013-11-14-01 1 1 
2013-11-14-04 1 6 
2013-11-14-07 1 1 
2013-11-14-08 1 1 
2013-11-14-09 2 2 
相關問題