2017-12-03 341 views
0

我正在编写shell脚本来替换数据库中的名称,为此,我有用户列表中的当前名称和新名称在.txt文件中。文件格式是像下面需要shell脚本语法帮助“for循环和awk”

**new name  current name** 
abc    pqr 
def    stq 
mnd    tdh 

对于这个我写个“for循环”使用awk命令,在这里我想它应该给我的$1abc值,defmnd

我写下如下循环,

function() 
{ 
cd $directory 

for i `cat $filename.txt` | awk '{print $1}' 
do 
     j=`grep "$i `cat $filename.txt ` | awk '{print $1'} |awk '{print $2}'"` 
     echo "update table SET username = '$i' WHERE username = '$j;" 
done 
} 

但不知何故,这是行不通的。有人可以帮助在这里写代码在shell脚本?

回答

0

你不提一个数据库或您的环境,但我认为你只是想是这样的:

awk '{print "update table SET username=" $1 " where username=" $2 ";"}' filename.txt| someSQLshell 

样本输出

update table SET username=newboy where username=oldboy; 
update table SET username=newemployee where username=badboy; 

测试输入

newboy oldboy 567 q 
newemployee badboy 190 r 

我不知道mysql,但我相信你能管到的命令,所以:

awk '{print "update table SET username=" $1 " where username=" $2 ";"}' filename.txt | mysql -h HOST -u USER -p PASSWORD DBNAME 

这可能工作过,但效率不高:

awk '{print "mysql -u user -p pass -e \"update table set username=" $1 " where username=" $2 "\""}' filename.txt 

样品输出

mysql -u user -p pass -e "update table set username=newboy where username=oldboy" 
mysql -u user -p pass -e "update table set username=newemployee where username=badboy" 

如果这看起来是正确的,您可以将其管bash

awk '{...}' | bash 

如果你真的想用bashfor循环,你可以做这样的事情:

#!/bin/bash 
cat filename.txt | while read new old _ ; do 
    echo "update table SET username=$new where username=$old;" 
done | mysql -u USER -p PASSWORD DBNAME 

在末尾留下| mysql ...位以查看准备好的输出mysql

+0

我在我们的环境中使用mysql .. – user263076

+0

我有一个'mysql'尝试一下,但谨慎行事,并用非常短的文件进行测试,以防万一它出错。 –

+0

很酷..谢谢..它工作。 – user263076