我有一个具有以下格式的文件:
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的东西。
感谢您的帮助。
答案 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