如何找到第一列的匹配行并添加第二列的数量?猛击

2024-10-03 11:13:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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。第二列是数量编号。你知道吗

中的某些行(仅限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

Tags: 文件csvechodoqtydoneskuka009
2条回答

对于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

我会用awk:

awk -F, 'NR==1{print} NR>1{a[$1] += $2}END{for (i in a) print i","a[i]}' file

如果要忽略空行,可以忽略小于2列的行:

awk -F, 'NR==1{print} NR>1 && NF>1{a[$1] += $2} END{for (i in a) print i","a[i]}' file

或者忽略没有两列的:

awk -F, 'NR==1{print} NR>1 && NF==2{a[$1] += $2} END{for (i in a) print i","a[i]}' file

或者,您可以检查第二列是否以数字开头:

awk -F, 'NR==1{print} NR>1 && $2~/^[0-9]/{a[$1] += $2} END{for (i in a) print i","a[i]}' file

相关问题 更多 >