我有一个“密钥”文件(基数顺序),如下所示:
ID
Name
Job
然后我从以下格式的错误更新语句中编辑了一个bin.log:
1
'Joe'
'Grocer'
2
'Bill'
'Mason'
我需要做的是使用相应的“密钥”文件,制定更新语句,结果如下:
update database.table set Name='Joe', Job='Grocer' WHERE ID=1;
update database.table set Name='Bill', Job='Mason' WHERE ID=2;
然而,这些需要适用于多列数据。密钥文件中的第一个字段始终是一个主键。换句话说,update语句中的'WHERE'子句将始终在密钥文件中使用此行。密钥文件第一行下的所有内容都是需要按顺序“设置”的列。
对于此示例,ID将是WHERE子句中的列,并且“Name”将首先设置为bin.log中的对应行,然后是“Job”等等,而此示例仅包含在密钥文件中有三行,可以有任意数行。但是,第一行始终是用于更新语句的结尾“WHERE”部分的列。
答案 0 :(得分:3)
awk '
NR==FNR { a[++m]=$0; next }
{
n = ((FNR-1) % m) + 1
v[n] = $0
}
n == m {
printf "update database.table set %s=%s, %s=%s WHERE %s=%s;\n", a[2], v[2], a[3], v[3], a[1], v[1]
}
' file bin.log
update database.table set Name='Joe', Job='Grocer' WHERE ID=1;
update database.table set Name='Bill', Job='Mason' WHERE ID=2;
如果你的问题确实是as @blackpen guessed,那么让它发挥作用的调整就是:
$ cat tst.awk
NR==FNR { a[++m]=$0; next }
{
n = ((FNR-1) % m) + 1
v[n] = $0
}
n == m {
printf "update database.table set"
for(i=2; i<=n; i++) {
printf "%s %s=%s", (i>2 ? "," : ""), a[i], v[i]
}
printf " WHERE %s=%s;\n", a[1], v[1]
}
$ awk -f tst.awk file bin.log
update database.table set Name='Joe', Job='Grocer' WHERE ID=1;
update database.table set Name='Bill', Job='Mason' WHERE ID=2;
答案 1 :(得分:1)
以下是执行您想要的脚本的草稿。如果你喜欢它,我们可以提高它的效率,风格和正确性。
<强> generate_statement.sh: 强>
#!/usr/bin/bash
read -r -a cnames <<< "$(echo $(cat cnames))"
numcols=${#cnames[@]}
counter=0; sclause=""
while read -r cvalue
do
if (( $counter == 0 ))
then
keys_value=$cvalue
elif (( $counter == $numcols-1 ))
then
sclause="$sclause, ${cnames[$counter]}=$cvalue"
read -r sclause <<< "$(echo $sclause | sed 's/,//')"
echo "update database.table set $sclause where ${cnames[0]}=$keys_value;"
sclause=""
else
sclause="$sclause, ${cnames[$counter]}=$cvalue"
fi
(( counter = ++counter % numcols))
done <<< "$(cat cvalues)"
<强> 的CNAME: 强>
ID
Name
Job
Height
Weight
<强> cvalues: 强>
1
'Joe'
'Grocer'
60
160
2
'Bill'
'Mason'
61
170
3
'John'
'Engineer'
65
180
4
'Jack'
'Doctor'
69
190
<强> 输出: 强>
update database.table set Name='Joe', Job='Grocer', Height=60, Weight=160 where ID=1;
update database.table set Name='Bill', Job='Mason', Height=61, Weight=170 where ID=2;
update database.table set Name='John', Job='Engineer', Height=65, Weight=180 where ID=3;
update database.table set Name='Jack', Job='Doctor', Height=69, Weight=190 where ID=4;
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed -r 's#.*#s/.*/&=\&/#;1s#$#;h#;1!s#.*#n;&;H#;$s#$#;x;s/^([^\\n]*)\\n(.*)/update.database.table set \\2 WHERE \\1;/;s/\\n/, /gp#' file |
sed -nrf - log
将文件转换为sed脚本,然后针对日志运行它。