Bash遍历文件中的重复值

时间:2018-11-16 12:23:46

标签: bash

我有一个具有以下格式的文件:

User_ID , Place_ID , Rating 
U32  ,   1305  ,   2 
U32  ,   1276  ,   2 
U32  ,   1789  ,   3 
U65  ,   1985  ,   1 
U65  ,   1305  ,   1 
U65  ,   1276  ,   2 

我想遍历此文件,按Place_ID排序,遍历Place_ID中的重复值并添加等级,一旦添加了Place_ID的最后一个元素,请检查如果value > x为true,则将Place_ID推入数组。

例如:Place_ID 1305:2 +1 / 2 = 1.5> 1 ----> ids + =($ id)

Place_ID 1276:2 + 2/2 = 2> 1 -----> ids + =($ id)

我尝试过

test5 () {

id=0
count=0
rating=0
ids=()
ratings=()
for i in `sort -t',' -k 2 ratings.csv`
do  
    aux=`echo "$i"| cut -f2 -d','`
    if (( $id != $aux )); then
        if (( $rating != 0 )); then
            rating=`echo "scale=1; $rating / $count" | bc -l`
            if (( $(echo "$rating >= 1" | bc -l) )); then
                ids+=($id)
                ratings+=($rating)
            fi
        fi
        id=$aux
        count=0
        rating=0
    else                        
        rating=$(($rating + `echo "$i"| cut -f3 -d','`))
        count=$(($count + 1))
    fi
done

echo ${#ids[@]}
echo ${#ratings[@]}
}

编辑:我认为它有效,但是有没有一种方法可以使它更好?不会迫使我使用尽可能多的if和count的东西。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是另一个使用较少if的选项:

#!/bin/bash

sum=()
count=()

while read -r line; do

    place=$(echo "$line" | cut -d',' -f2)
    rating=$(echo "$line" | cut -d',' -f3)

    sum[$place]=$(echo "$rating + ${sum[$place]-0}" | bc -l)
    count[$place]=$((count[$place] + 1))

done < <( sed 1d ratings.csv | sort -t',' -k 2 | tr -d '[:blank:]' )

ratings=()
for place in "${!sum[@]}"; do
    ratings[$place]=$(echo "scale=1; ${sum[$place]} / ${count[$place]}" | bc -l)
done

# ratings at this point has the ratings for each place
echo ${!ratings[@]} # place ids
echo ${ratings[@]} # ratings

我假设您的ratings.csv具有标头,这就是为什么它具有sed 1d ratings.csv