Perhitungan jarak euclidean dengan awk tidak memberikan keluaran yang diharapkan

sebagai masukan perhitungan jarak saya mempunyai file (inp.txt) yang berisi koordinat:

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

Tiga kolom pertama adalah koordinat suatu titik (misalkan A) sedangkan tiga kolom terakhir adalah koordinat titik kedua (misalkan B). Saya ingin menghitung jarak antara A dan B dan semua titik lainnya yang disusun dengan cara yang sama pada baris berikut. Kemudian, saya mengharapkan nilai jarak keluaran 5, dalam hal ini.

Kode awk saya yang saya gunakan untuk tujuan ini:

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

Memasukkannya saya mendapatkan kesalahan:

 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)

Saya mencoba mencari tahu mengapa saya mendapatkan kesalahan ini tetapi tidak berhasil. Terima kasih atas bantuan apa pun.


person Maurizio Cirilli    schedule 16.08.2020    source sumber


Jawaban (2)


Apakah file masukan ada di tempat yang Anda kira? Skrip Anda berfungsi untuk saya dengan inp.txt di direktori saat ini. Jika saya sengaja mereferensikan nama file yang buruk, ada kesalahan yang serupa dengan Anda:

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)

Selain itu, Anda mungkin tidak ingin kondisi END ada di sana, jika Anda mengharapkan nilai untuk setiap baris, bukan hanya baris terakhir...

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
Terima kasih Ian. Ya itu nama file yang buruk. Maaf atas pertanyaan konyolnya. Bagaimanapun, Anda juga membantu saya dengan iterasinya. Bisakah Anda menjelaskan mengapa END menghambat iterasi di awk? Saya pikir itu wajib untuk tujuan saya. - person Maurizio Cirilli; 17.08.2020
comment
Tidak, nama file yang buruk atau hilang tidak menyebabkan Anda mendapatkan pesan kesalahan 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
Terima kasih Ed, jawaban Anda sebenarnya benar di sini, Anda mendapatkan suara positif saya. Maurizio, kondisi END hanya berlaku setelah semua baris dibaca - tindakan setelah end dipicu pada titik tersebut. Jika Anda ingin memproses pada setiap baris masukan, maka END tidak diperlukan dalam skrip ini. Ini biasanya digunakan ketika Anda ingin meringkas beberapa data dan kemudian menampilkan informasi ringkasan. - person Ian McGowan; 20.08.2020

Anda melakukan awk -f '{x1=$1;...}' atau awk 'foo' '{x1=$1;...}' alih-alih awk '{x1=$1;...}' jadi awk mencoba membuka skrip seolah-olah itu adalah nama file. Yang terakhir ini lebih mungkin terjadi mengingat pesan kesalahan spesifik tersebut. Lihat:

$ 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