нужна помощь в синтаксисе сценария оболочки для цикла for и awk

Я пишу сценарий оболочки для замены имен в базе данных, для этого у меня есть список текущих имен пользователей и новое имя в файле .txt. Формат файла, как показано ниже

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

Для этого я пишу «для цикла», используя команду awk, где я хочу, чтобы она давала мне значение $1, то есть abc, def, mnd и т. д.

Я написал для цикла, как показано ниже,

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
} 

Но почему-то это не работает. может кто-нибудь помочь здесь написать код в сценарии оболочки?


person user263076    schedule 03.12.2017    source источник


Ответы (1)


Вы не упоминаете базу данных или свою среду, но я думаю, вам просто нужно что-то вроде:

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

Если вы действительно хотите использовать bash и цикл for, вы можете сделать это примерно так:

#!/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.

person Mark Setchell    schedule 03.12.2017
comment
У меня была небольшая попытка с mysql, но действуйте с осторожностью и проверьте с ОЧЕНЬ КОРОТКИМ файлом на случай, если он неправильный. - person Mark Setchell; 03.12.2017
comment
Я получил результат, который я искал. Но просто хотел узнать, могу ли я получить ту же информацию, но с использованием цикла for? - person user263076; 03.12.2017
comment
Я добавил, как вы можете сделать это с помощью цикла for в конце. Пожалуйста, взгляните еще раз. - person Mark Setchell; 03.12.2017