Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按类别添加数量的Bash脚本_Bash_Shell - Fatal编程技术网

按类别添加数量的Bash脚本

按类别添加数量的Bash脚本,bash,shell,Bash,Shell,我需要一个按类别添加数量的bash脚本的帮助 输入行和输出行的形式为“类别”“数量” 示例文件: Mustard 6 Apple 4 Mustard 2 输出应为: Mustard 8 Apple 4 顺序不重要,可能是: Apple 4 Mustard 8 文件/输入格式正确,第二个字段为数字(可能为负数) 仅使用sh shell脚本,不使用awk、python、perl等 我需要以cat“$@”|开始代码 到目前为止,我所拥有的: cat "$@" | while read line

我需要一个按类别添加数量的bash脚本的帮助

输入行和输出行的形式为“类别”“数量”

示例文件:

Mustard 6
Apple 4
Mustard 2
输出应为:

Mustard 8
Apple 4
顺序不重要,可能是:

Apple 4
Mustard 8
文件/输入格式正确,第二个字段为数字(可能为负数)

仅使用sh shell脚本,不使用awk、python、perl等

我需要以cat“$@”|开始代码

到目前为止,我所拥有的:

cat "$@" | while read line
do
如果第一行的第一个单词=第二行的第一个单词,则添加$2并删除该行,对所有行重复此操作

done
我不确定如何在while循环之间实现,我正在考虑一个关联数组,我几乎可以肯定这就是我所需要的


感谢您的帮助

如果我们可以使用
bash
但不能使用
awk

#!/bin/bash
declare -A c
cat "$@" | { while read item amount
do
    ((c[$item]+=$amount))
done

for i in "${!c[@]}"
do
    echo "$i ${c[$i]}"
done
}
这将产生:

Mustard 8
Apple 4
如果我们没有这样的限制,我们可以使用
awk
,这使事情变得更容易:

awk '{ c[$1]+=$2 } END { for (i in c) { print i,c[i] } }' groceries
或者,如果我们想从
cat“$@”
开始,那么:

cat "$@" | awk '{ c[$1]+=$2 } END { for (i in c) { print i,"=",c[i] } }'

有没有一种不用awk的方法?我被要求使用cat“$@”来开始并用其他东西进行管道连接。
awk
很容易适应
cat“$@”
的要求。您是否也被要求不要使用awk?我相信是的,awk是特别提到要避免的。我正在上一门介绍课程,所以我们还没有到awk,只是一些基本的东西。我明白我需要做什么:当逐行读取文件时,for循环检查行并检查重复项,然后添加$2的值,我只是不知道如何实现它。添加一个!在数组前面输出所有的索引?@NickGong是的。如果没有它,它将返回金额,而不是类别。