这可以在击4本身做:
#!/bin/bash
declare -A vals_one vals_two
while IFS=- read key val1 val2; do
if [[ ${vals_one["$key"]} ]] ; then
vals_one["$key"]=$((${vals_one["$key"]} + val1))
vals_two["$key"]=$((${vals_two["$key"]} + val2))
else
vals_one["$key"]=$val1
vals_two["$key"]=$val2
fi
done < <(cat input1.txt input2.txt)
for key in "${!vals_one[@]}"; do
printf '%s-%s-%s\n' "$key" "${vals_one[$key]}" "${vals_two[$key]}"
done
注意,这种方法有点记忆效率低下;一个更有效率的内存方法会在合并之前对文件进行排序(如果排序的内容不能适应内存,那么GNU排序能够生成临时文件,因此比我们写的任何合理的脚本更有能力),因此只需要同时储存两行内存:
#!/bin/bash
function merge_inputs {
IFS=- read key val1 val2
while IFS=- read new_key new_val1 new_val2; do
if [[ $key = "$new_key" ]] ; then
val1=$((val1 + new_val1))
val2=$((val2 + new_val2))
else
printf '%s-%s-%s\n' "$key" "$val1" "$val2"
key=$new_key
val1=$new_val1
val2=$new_val2
fi
done
printf '%s-%s-%s\n' "$key" "$val1" "$val2"
}
sort input1.txt input2.txt | merge_inputs
此外,这后一种形式不需要关联数组,并会与旧版本的bash的工作(或者,某些修改,其他shell) 。
+1美丽的解决方案。 – kev 2012-04-28 11:30:26
这是美丽的 – flatronka 2012-04-28 11:36:40
美是主观的,有时只有皮肤深,并伴有低智力。在这里,“美”植根于能够将字符串值视为数字,并能够增加从未定义的变量。如果你拼错了一个变量,awk没有警告。如果一个字符串包含的东西不是一个数字,它只是零,那么...... awk'{print'a'+ 1}''高兴地产生1。没问题,只是总是用你的“美丽的节目”“美丽的输入”。 – Kaz 2012-05-15 22:19:29