如何查找第一列的匹配行并添加第二列的数量?巴什

时间:2018-02-02 00:51:49

标签: python bash perl

我有一个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

2 个答案:

答案 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

https://github.com/tigertv/stackoverflow-answers