使用 shell 脚本计算每行中存在的唯一字符串的数字

使用 shell 脚本计算每行中存在的唯一字符串的数字

我正在使用 unix shell 脚本,并且有一个输入文件,其数据如下:

3:abc
1:xyz
1:abc
2:def
10:xyz

我的预期输出是:

4:abc
11:xyz
2:def

即在定界符之后的每一行上找到唯一的字符串,并将其之前的数字相加。这个怎么做?

答案1

这是一个使用的解决方案awk。它将值累积到一个数组中。

awk -F ":" '{count[$2]+=$1} END {for (key in count) print key, count[key]}' awk_data.txt

这是一个使用bash脚本的版本:

#!/usr/bin/env bash
declare -A count
while read line; do
    key=${line##*:}
    cnt=${line%%:*}
    count[$key]=$(($cnt + ${count[$key]=0}))
done < "$1"
for K in "${!count[@]}"; do echo $K ${count[$K]}; done

bash评论中的另一个版本,使用IFS=:

#!/usr/bin/env bash
declare -A count
while IFS=: read -r cnt key; do
    count[$key]=$(($cnt + ${count[$key]=0}))
done < "$1"
for K in "${!count[@]}"; do echo $K ${count[$K]}; done

答案2

您可能还想从 GNU 中获取战利品数据混合公用事业。示例(PO 中的 table.txt):

$ sort -t: -k 2 table.txt | datamash -t: -g 2 sum 1 collapse 1
abc:4:1,3
def:2:2
xyz:11:10,1
  • -t:字段分隔符是:
  • -g 2按(先前排序的)第二列分组
  • sum 1对第 1 列中的相应值求和
  • collapse 1并将它们折叠在“,”单独的列表中

相关内容