butuh bantuan dalam sintaks skrip shell untuk for loop dan awk

Saya sedang menulis skrip shell untuk mengganti nama di database, untuk ini saya memiliki daftar pengguna nama saat ini dan nama baru di file .txt. Format file seperti di bawah ini

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

Untuk ini saya menulis "for loop" dengan menggunakan perintah awk, yang saya inginkan harus memberi saya nilai $1 yaitu abc ,def,mnd dll.

Saya telah menulis for loop seperti di bawah ini,

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
} 

Tapi entah kenapa ini tidak berhasil. dapatkah seseorang membantu di sini untuk menulis kode dalam skrip shell?


person user263076    schedule 03.12.2017    source sumber


Jawaban (1)


Anda tidak menyebutkan database atau lingkungan Anda, tapi menurut saya Anda hanya menginginkan sesuatu seperti:

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

Contoh Keluaran

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

Masukan Uji

newboy oldboy    567    q
newemployee badboy    190    r

Saya tidak tahu mysql tapi saya yakin Anda bisa memasukkan perintah ke dalamnya, jadi:

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

Ini mungkin berhasil juga, tetapi kurang efisien:

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

Contoh Keluaran

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"

dan jika terlihat benar, Anda dapat menyalurkannya ke bash:

awk '{...}' | bash

Jika Anda benar-benar ingin menggunakan loop bash dan for, Anda dapat melakukannya seperti ini:

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

Tinggalkan bit | mysql ... di akhir untuk melihat keluaran yang disiapkan untuk mysql.

person Mark Setchell    schedule 03.12.2017
comment
Saya telah mencoba sedikit dengan mysql tetapi lanjutkan dengan hati-hati dan uji dengan file SANGAT SINGKAT jika ada yang salah. - person Mark Setchell; 03.12.2017
comment
Saya mendapatkan hasil yang saya cari. Tapi hanya ingin tahu bisakah saya mendapatkan informasi yang sama tetapi menggunakan for loop? - person user263076; 03.12.2017
comment
Saya telah menambahkan bagaimana Anda dapat melakukannya dengan loop for di akhir. Silakan lihat lagi. - person Mark Setchell; 03.12.2017