ต้องการความช่วยเหลือในด้านไวยากรณ์ของเชลล์สคริปต์สำหรับ for loop และ awk

ฉันกำลังเขียนเชลล์สคริปต์เพื่อแทนที่ชื่อในฐานข้อมูล ด้วยเหตุนี้ ฉันมีรายชื่อผู้ใช้ชื่อปัจจุบันและชื่อใหม่ในไฟล์ .txt รูปแบบไฟล์จะเป็นดังนี้

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

สำหรับสิ่งนี้ ฉันกำลังเขียน "for loop" โดยใช้คำสั่ง 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 loop ได้ไหม - person user263076; 03.12.2017
comment
ฉันได้เพิ่มวิธีที่คุณสามารถทำได้ด้วยการวนซ้ำ for ในตอนท้าย ขอดูอีกหน่อย. - person Mark Setchell; 03.12.2017