2014-09-20 3 views
0

bash는 스크립트의 논리를 수정 할 수 없습니다 :나는 다음과 같은 항목으로 (UserInputDetails 말) 테이블이

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 | 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 |   
+------------+-----------+----------+    

내가으로 예상되는 출력을 제공하는 쉘 스크립트를 작성해야을

출력 설명 :

첫 번째 입력 줄은 screenId '13_1_2_1'에 대한 특정 userInput의 numInputs를 나타냅니다. 이 라인은 먼저 screenId를 인쇄 한 다음 userInput 0-9에 해당하는 NumInput을 인쇄합니다. userInput '2'에 대한 numInput은 9이고 나머지 0-9는 0이므로 값은 13_1_2_1,0090000000

다음 함수에 대해 작성된 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 

논리가 잘못되어 논리가 올바르지 않습니다. 위의 쉘 스크립트의 결과는 다음과 같습니다.

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, 

제 스크립트에서 논리를 수정하도록 도와주십시오. 또한 스크립팅과 프로그래밍을 처음 접했으므로이 작업을 수행하는 효율적인 방법이 아닐 수도 있습니다. 효율적인 방법이 있는지 제안하십시오.

답변

0

스크립트에 여러 가지 오류가 있습니다. 여기에 후반의 재 작성이있다 :

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 
:

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를 호출 피할 수 있습니다

관련 문제