我如何为每个唯一字符串添加值?



基本上,我从文本文件中提取一个字符串和一个整数:

cat file.txt | cut -d " " -f 1,3 | sort

输出如下所示:

white 3
white 2
white 54
red 23
red 2
yellow 22

我如何添加值与bash脚本的唯一字符串?

首先,改掉UUoC的习惯。

declare -A totals=()
while read -r color _ count _; do
totals[$color]=$(( "${totals[$color]:- 0}" + count ))
done < file.txt 
for color in ${!totals[@]}; do echo "$color ${totals[$color]}"; done | sort

输出:

red 25
white 59
yellow 22

如果它非常大,在awk中效率会更高。

示例数据文件:

$ cat file.txt
white stuff 3 more stuff
white stuff 2 more stuff
white stuff 54 more stuff
red stuff 23 more stuff
red stuff 2 more stuff
yellow stuff 22 more stuff

一个awk解决方案来取代所有当前代码生成总数:

awk '
{ totals[$1]+=$3}
END { for (i in totals)
print i,totals[i]
}
' file.txt
# or as a one-liner
awk '{totals[$1]+=$3} END {for (i in totals) print i,totals[i]}' file.txt

由此产生:

red 25
yellow 22
white 59

如果需要排序,则将输出管道输出到sort,例如:

awk '{totals[$1]+=$3} END {for (i in totals) print i,totals[i]}' file.txt | sort

或者如果使用GNU awk:

awk '
{ totals[$1]+=$3}
END { PROCINFO["sorted_in"]="@ind_str_asc"
for (i in totals)
print i,totals[i]
}
' file.txt

这两个都生成:

red 25
white 59
yellow 22

最新更新