我有一个csv文件,如下所示:
SKU,QTY
KA006-001,2
KA006-001,33
KA006-001,46
KA009-001,22
KA009-001,7
KA010-001,18
KA014-001,3
KA014-001,42
KA015-001,1
KA015-001,16
KA020-001,6
KA022-001,56
第一栏是SKU。第二列是QTY编号。
(仅限SKU列)中的某些行相同。
我需要实现以下目标:
SKU,QTY
KA006-001,81 (2+33+46)
KA009-001,29 (22+7)
KA010-001,18
KA014-001,45 (3+42)
等......
我尝试了不同的东西,循环语句和数组。迷路了,头疼了。
我的代码:
#!/bin/bash
while IFS=, read sku qty
do
echo "SKU='$sku' QTY='$qty'"
if [ "$sku" = "$sku" ]
then
#x=("$sku" != "$sku")
for i in {0..3}; do echo $sku[$i]=$qty; done
fi
done < 2asg.csv
答案 0 :(得分:3)
我使用 awk :
numpy.roll(arr)
如果要忽略空行,可以忽略少于2列的行:
ndarray
或忽略没有2列的那些:
awk -F, 'NR==1{print} NR>1{a[$1] += $2}END{for (i in a) print i","a[i]}' file
或者,您可以检查第二列是否以数字开头:
awk -F, 'NR==1{print} NR>1 && NF>1{a[$1] += $2} END{for (i in a) print i","a[i]}' file
答案 1 :(得分:0)
对于Bash 4:
#!/bin/bash
declare -A astr
while IFS=, read -r col1 col2
do
if [ "$col1" != "SKU" ] && [ "$col1" != "" ]
then
(( astr[$col1] += col2 ))
fi
done < 2asg.csv
echo "SKU,QTY"
for i in "${!astr[@]}"
do
echo "$i,${astr[$i]}"
done | sort -t : -k 2n