无法修复bash脚本的逻辑

时间:2014-09-20 14:35:35

标签: mysql bash shell

我有一个表(比如UserInputDetails),其中包含以下条目:

+------------+-----------+----------+                                               
| screenId   | userInput | numInput |
+------------+-----------+----------+                                            
| 13_1_2_1   | 2         |        9 |                           
| 13_1_2_2   | 2         |        9 |                       
| 13_1_2_2   | 3         |        2 |                       
| 13_1_2_2   | 9         |        2 |                 
| 13_1_2_2_2 | 3         |        3 |          
| 13_1_2_2_2 | 5         |        2 |   
| 13_2_2_2   | 4         |        4 |          
| 13_2_2_2   | 5         |        4 |         
| 13_2_2_2   | 7         |        2 |         
+------------+-----------+----------+             

我需要编写一个shell脚本,它的预期输出为:

13_1_2_1,0,0,9,0,0,0,0,0,0,0
13_1_2_2,0,0,9,2,0,0,0,0,0,2
13_1_2_2_2,0,0,0,3,0,2,0,0,0,0
13_2_2_2,0,0,0,0,4,4,0,2,0,0 

输出说明:

第一行输入表示screenId'13_1_2_1'的特定userInput的numInput。该行首先打印screenId,然后打印userInput 0-9的相应NumInput。由于userInput'2'的numInput为9,而0-9的其余部分为0,因此它给出值13_1_2_1,0,0,9,0,0,0,0,0,0,0

为以下函数编写的bash脚本是:

 #!/bin/bash 

 MYSQL="mysql -uroot -proot -N Database1"

 yesterday=""


 if [ $# -ge 1 ]
 then
     yesterday="$1"
 else
     yesterday=`$MYSQL -sBe "select date_sub(date(now()), interval 1 day);"`
 fi
 echo "DATE: $yesterday"

 PREVSCREENID=''
 SCREENID=
 ABC=tempSqlDataFile
 $MYSQL -sBe "select screenId, userInput, numInput from userInputDetails group by screenID, userInput" > $ABC

 for i in {0..9} 
 do
    arr[$i]='0'
 done

 while read line
 do

     SCREENID=`echo $line | awk '{ print $1 }'`
     i=`echo $line | awk '{print $2 }'`
     arr[$i]=`echo $line | awk '{print $3}'`
     if [[ $SCREENID != $PREVSCREENID ]]
     then
         echo "$SCREENID ${arr[*]}" | tr ' ' ','
         for i in {0..9}
         do
             arr[$i]='0'
         done
     else
         i=`echo $line | awk '{print $2 + 1}'`
         arr[$i]=`echo $line | awk '{print $3}'`
     fi
     PREVSCREENID=$SCREENID
 done < $ABC

某处的逻辑出错了,我无法正确理解逻辑。上面的shell脚本的输出是:

13_1_2_1,0,0,9,0,0,0,0,0,0,0,
13_1_2_2,0,0,9,0,0,0,0,0,0,0,
13_1_2_2_2,0,0,9,3,0,0,0,0,0,2,
13_2_2_2,0,0,0,3,4,2,0,0,0,0,

请问我可以帮助我修复脚本中的逻辑吗?此外,由于我不熟悉脚本和编程,这可能不是执行此任务的有效方法。请建议是否有效。

1 个答案:

答案 0 :(得分:0)

您的脚本中存在许多错误。这是对后一部分的重写:

while read SCREENID i n; do
    if [[ "$SCREENID" != "$PREVSCREENID" ]]; then
        [ "$PREVSCREENID" ] && echo "$PREVSCREENID ${arr[*]}" | tr ' ' ,
        for j in {0..9}; do arr[$j]=0; done
    fi
    arr[$i]="$n"
    PREVSCREENID="$SCREENID"
done < "$ABC"
echo "$PREVSCREENID ${arr[*]}" | tr ' ' ,

您可以避免像这样调用tr

print_arr() { IFS=,; echo $PREVSCREENID,"${arr[*]}"; unset IFS; }

while read SCREENID i n; do
    if [[ "$SCREENID" != "$PREVSCREENID" ]]; then
        [ "$PREVSCREENID" ] && print_arr
        for j in {0..9}; do arr[$j]=0; done
    fi
    arr[$i]="$n"
    PREVSCREENID="$SCREENID"
done < "$ABC"
print_arr