2016-04-19 4 views
1

私は2つの異なるファイルを持っています。これらのファイルの一部は次のとおりです。シェルスクリプトを使用して、特定の場所に最も近い格子点を見つける方法は?

ファイル1:

ifile1.txt 
21 10.3 70.32 09 
32 11.3 71.43 10 
33 15.4 75.00 00 
54 17.3 68.03 12 
95 19.2 65.02 21 
99 20.1 80.10 11 
and so on...... 

Where 1st column is the ID, 
     2nd column refers to x-axis, 
     3rd column refers to y-axis, 
     4th column refers to value 

FILE2:

ifile2.txt 
10.10 70.12 10 
10.11 73.33 08 
11.05 72.40 00 
11.30 69.13 15 
12.00 64.02 27 
12.05 79.20 25 
13.10 80.32 10 
13.11 75.43 06 
14.05 74.00 02 
14.20 69.03 15 
16.40 65.02 13 
16.55 68.10 14 
and so on...... 

Where 1st column refers to x-axis, 
     2nd column refers to y-axis, 
     3rd column refers to value 

私はその出力(上記の例の場合)となります別のファイルを作成するllikeう

ofile.txt 
21 10.10 70.12 10 
32 11.05 71.40 10 
33 14.05 74.00 02 
54 16.55 68.10 14 
95 16.55 68.10 14 
99 16.55 68.10 14 

Where 1st column is the ID (taken from ifile1.txt), 
     2nd and 3rd column refers to x-axis and y-axis (taken from ifile2.txt which are the nearest to those of ifile1.txt), 
     4th column refers to corresponding value (taken from ifile2.txt) 

私はこれのためのシェルスクリプトを書くことができません。しかし、私のアルゴリズムは:

for each $1 in ifile1.txt, 
    for each $2 & $3 in ifile1.txt, 
    find a $2 & $3 in ifile2.txt such that 
     sqrt{[$2(ifile1.txt)-$2(ifile2.txt)]^2+[$3(ifile1.txt)-$3(ifile2.txt)]^2} is minimum for all $2 & $3 in ifile2.txt 
    find correcsponding $4 from ifile2.txt 
    write $1, $2, $3, $4 to ofile.txt 

私は非常に提案や助けに感謝します。

+1

これをシェルで書きますか? –

+0

できませんか? – Kay

+0

可能ですが、容易でも効率的でもありません。 –

答えて

1

ここではawkの簡単な解決法があります。私のLinuxでは正常に動作しました。 私の答えが役に立ったら、私の答えの左側にある灰色の目盛り記号をクリックしてください。

#!/bin/bash 
(($#!=2))&& { echo "Usage $0 1st_file 2nd_file"; exit 1; } 
awk ' 
BEGIN {p=fx=0; fn=""; maxd=1.1e11;} 
$0~"[^0-9. \t]" || NF!=4 && NF!=3 {next;}   # skip no data lines 
fn!=FILENAME {fx++; fn=FILENAME;}     # fx: which file 
fx==1 { if(NF!=3){printf("Change the series of two input files\n"); exit 1;} 
     x2[p]=$1; y2[p]=$2; d2[p++]=$3;next;}  # save the columns of first file 
fx==2 { mv=maxd; mp=0;        # search minimal distance 
      for(i=0; i<p; i++){ 
       dx=x2[i]-$2; dy=y2[i]-$3; dd=dx*dx+dy*dy; 
       if(dd<mv){mv=dd; mp=i;}    # min value & min place 
      } 
      printf("%3d %6.2f %6.2f %3d\n", $1, x2[mp], y2[mp], d2[mp]); 
     } 
' $2 $1            # first is the 2nd_file! 
+0

ありがとうございました..このスクリプトはとてもうまく動作しています。私は数日以来、非常に努力していました。 – Kay

関連する問題