无法修复bash脚本

问题描述:

我有一个表(说UserInputDetails)具有以下条目的逻辑:无法修复bash脚本

+------------+-----------+----------+            
| 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的numInputs。该行首先打印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, 

请你能帮我修复我的脚本中的逻辑?另外,由于我不熟悉脚本和编程,因此这可能不是执行此任务的有效方法。请建议,如果有一个有效的方法。

脚本中有许多错误。下面是后期的改写:

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