我正在使用 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
并将它们折叠在“,”单独的列表中