การคำนวณระยะทางยุคลิดด้วย awk ไม่ให้ผลลัพธ์ที่คาดหวัง

เป็นอินพุตสำหรับการคำนวณระยะทาง ฉันมีไฟล์ (inp.txt) ที่มีพิกัด:

9.911 -2.781 30.097 7.768 -4.335 29.094
11.811 -1.900 30.082 13.294 -1.993 27.440
6.947 -0.742 31.786 6.390 -2.976 30.089
8.960 -2.090 32.359 11.764 1.604 25.408
9.156 -3.314 29.815 11.764 1.604 25.408

สามคอลัมน์แรกเป็นพิกัดของจุด (สมมติว่า A) ในขณะที่สามคอลัมน์สุดท้ายเป็นพิกัดของจุดที่สอง (สมมติว่า B) ฉันต้องการคำนวณระยะห่างระหว่าง A และ B และจุดอื่นๆ ทั้งหมดที่จัดเรียงในลักษณะเดียวกันในแถวต่อไปนี้ จากนั้นฉันคาดหวังว่าจะเป็นค่าระยะทางเอาต์พุต 5 ค่าในกรณีนี้

รหัส awk ของฉันที่ฉันใช้เพื่อจุดประสงค์นี้:

awk '{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' inp.txt >> out.txt

เมื่อเข้าไปแล้วฉันได้รับข้อผิดพลาด:

 awk: fatal: cannot open file `{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' for reading (No such file or directory)

ฉันพยายามหาสาเหตุว่าทำไมฉันถึงได้รับข้อผิดพลาดนี้แต่ไม่สำเร็จ ขอบคุณสำหรับความช่วยเหลือใด ๆ


person Maurizio Cirilli    schedule 16.08.2020    source แหล่งที่มา


คำตอบ (2)


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

t2$ awk '{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} {print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' inpBAD.txt
awk: fatal: cannot open file `inpBAD.txt' for reading (No such file or directory)

นอกจากนี้ คุณอาจไม่ต้องการให้มีเงื่อนไข END หากคุณคาดหวังค่าสำหรับทุกแถว ไม่ใช่แค่แถวสุดท้าย...

t2$ awk '{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' inp.txt
7.1

t2$ awk '{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} {print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' inp.txt
2.83079
3.03119
2.86021
8.3561
7.1
person Ian McGowan    schedule 16.08.2020
comment
ขอบคุณเอียน ใช่ มันเป็นชื่อไฟล์ที่ไม่ดี ขออภัยสำหรับคำถามโง่ๆ ยังไงก็ตามคุณช่วยฉันในการวนซ้ำเช่นกัน คุณช่วยอธิบายได้ไหมว่าทำไม END จึงขัดขวางการวนซ้ำใน awk ฉันคิดว่าเป็นข้อบังคับแทนเพื่อจุดประสงค์ของฉัน - person Maurizio Cirilli; 17.08.2020
comment
ไม่ ชื่อไฟล์ที่ไม่ถูกต้องหรือหายไปไม่ได้ทำให้คุณได้รับข้อความแสดงข้อผิดพลาด awk: fatal: cannot open file `{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' for reading (No such file or directory) - person Ed Morton; 17.08.2020
comment
ขอบคุณเอ็ด คำตอบของคุณคือคำตอบที่ถูกต้องจริง ๆ ที่นี่ คุณได้รับคะแนนโหวตของฉัน เมาริซิโอ เงื่อนไข END จะเป็นจริงหลังจากอ่านทุกบรรทัดแล้วเท่านั้น การดำเนินการหลังจากสิ้นสุดจะถูกทริกเกอร์ที่จุดนั้น หากคุณต้องการประมวลผลทุกบรรทัดอินพุต ก็ไม่จำเป็นต้องลงท้ายในสคริปต์นี้ โดยทั่วไปจะใช้เมื่อคุณต้องการสรุปข้อมูลบางส่วนแล้วแสดงข้อมูลสรุป - person Ian McGowan; 20.08.2020

คุณทำ awk -f '{x1=$1;...}' หรือ awk 'foo' '{x1=$1;...}' แทนที่จะเป็น awk '{x1=$1;...}' ดังนั้น awk จึงพยายามเปิดสคริปต์เหมือนกับว่าเป็นชื่อของไฟล์ อย่างหลังมีแนวโน้มที่จะได้รับข้อความแสดงข้อผิดพลาดเฉพาะนั้นมากกว่า ดู:

$ awk -f '{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' inp.txt >> out.txt
awk: fatal: cannot open source file `{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' for reading: No such file or directory

$ awk '7' '{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' inp.txt >> out.txt
awk: fatal: cannot open file `{x1=$1;y1=$2;z1=$3} {x2=$4;y2=$5;z2=$6} END{print sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)}' for reading: No such file or directory
person Ed Morton    schedule 17.08.2020