gpt4 book ai didi

mysql - 无法修复bash脚本的逻辑

转载 作者:行者123 更新时间:2023-11-29 23:45:57 25 4
gpt4 key购买 nike

我有一个表(例如 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”的特定用户输入的 numInputs。该行首先打印 screenId,然后打印 userInput 0-9 的相应 NumInput。由于 userInput '2' 的 numInput 为 9,其余 0-9 的 numInput 为 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

关于mysql - 无法修复bash脚本的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25949853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com