5

2 列のデータを含むファイルがあり、最初の列で類似点の発生をカウントしたいと考えています。最初の列の 2 つの類似したエントリが一致した場合、一致した 2 つのエントリの 2 番目の列の値も合計したいと思います。

リストの例:

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 の混合物を使用してこれを完了するためのヒントはありますか?

4

2 に答える 2

5

awkとを使った簡単な例を次に示しsortます。

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出力行の順序を気にしない場合は、スキップできます。

于 2013-11-14T18:51:09.063 に答える
1

ここで純粋な Bash ソリューション

$ 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 
于 2013-11-14T21:04:39.400 に答える