2012-07-08 75 views
1

WORKS !!比較兩個文件中的字段並進行計算

見下文......

更新了我的腳本...

問題是,它只是在輸出外循環的第一線。一件簡單的事情是錯誤的,我沒有看到它。

該腳本從兩個文件讀取並進行計算。 這裏有文件...

$ awk -F',' '{print $1, $2, $3, $4}' s1.txt 
2017 5155 41.46097500 -78.99436944 
2017 5156 41.46157778 -78.99437500 
2017 5157 41.46218611 -78.99437778 
2017 5158 41.46278611 -78.99438056 
2017 5159 41.46339722 -78.99438333 
2017 5160 41.46399444 -78.99438611 


$ awk -F',' '{print $11, $12}' data.txt 
41.46098533 -78.99440559 
41.46217481 -78.99440703 
41.46158424 -78.99439119 
41.46278446 -78.99439355 
41.46338829 -78.99440672 
41.46399091 -78.99439231 
#! /usr/bin/awk -f 

BEGIN { 
    while (getline < "s1.txt") { 
     split($0, ft, ",") 
     line = ft[1] 
     station = ft[2] 
     lat1 = ft[3] 
     lon1 = ft[4] 

     while (getline < "data.txt") { 
      split($0, ft, ",") 
      lat2 = ft[11] 
      lon2 = ft[12] 

      x = (lon2 - lon1) * cos((lat1 + lat2)/2) 
      y = (lat2 - lat1) 
      d = sqrt(x * x + y * y) * 6371 

      print line","station","lat1","lon1","lat2","lon2","d | "sort -t, -h -k7 |head -1" 

     } 
    } 
} 

輸出..

2017,5155,41.46097500,-78.99436944,41.46098533,-78.99440559,0.198629 

此加載從s1.txt第一線和比較data.txt中的所有行。

我需要將s1.txt前進到下一行並循環,直到到達s1.txt的末尾。

???

我加了一些打印命令

#! /usr/bin/awk -f 

BEGIN { 
    while (getline < "s1.txt") { 
     split($0, ft, ",") 
     line = ft[1] 
     station = ft[2] 
     lat1 = ft[3] 
     lon1 = ft[4] 
     print "loop1" 
     while (getline < "data.txt") { 
      split($0, ft, ",") 
      lat2 = ft[11] 
      lon2 = ft[12] 

      x = (lon2 - lon1) * cos((lat1 + lat2)/2) 
      y = (lat2 - lat1) 
      d = sqrt(x * x + y * y) * 6371 
      print "loop2" 
      print line","station","lat1","lon1","lat2","lon2","d | "sort -t, -h -k7 |head -1" 

     } 
    } 
} 

看起來它通過工作一次。之後,它不會進入第二個循環。

$ resolv.awk 
loop1 
loop2 
loop2 
loop2 
loop2 
loop2 
loop2 
loop2 
loop2 
loop2 
loop1 
loop1 
loop1 
loop1 
loop1 
loop1 
loop1 
2017,5155,41.46097500,-78.99436944,41.46104466,-78.99446284,0.656815 

如果我使用一個休息的內環它正確地循環,但突破不會讓它正常工作,因爲它每次取第一線從匹配的文件。我想也許這些文件需要交換。匹配文件的內部循環和數據的外部循環。

或者一些條件聲明中斷。

#! /usr/bin/awk -f 
BEGIN { 
    while (getline < "s1.txt") { 
     split($0, ft, ",") 
     line = ft[1] 
     station = ft[2] 
     lat1 = ft[3] 
     lon1 = ft[4] 
     print "loop1" 
     while (getline < "data.txt") { 
      split($0, ft, ",") 
      lat2 = ft[11] 
      lon2 = ft[12] 

      x = (lon2 - lon1) * cos((lat1 + lat2)/2) 
      y = (lat2 - lat1) 
      d = sqrt(x * x + y * y) * 6371 
     print "loop2" 
      print line","station","lat1","lon1","lat2","lon2","d 
     break 
     } 
    } 
} 

    $ resolv.awk 
loop1 
loop2 
2017,5155,41.46097500,-78.99436944,41.46104466,-78.99446284,0.656815 
loop1 
loop2 
2017,5156,41.46157778,-78.99437500,41.46162354,-78.9943992,0.317363 
loop1 
loop2 
2017,5157,41.46218611,-78.99437778,41.46215576,-78.99438806,0.200558 
loop1 
loop2 
2017,5158,41.46278611,-78.99438056,41.46281488,-78.99439355,0.195243 
loop1 
loop2 
2017,5159,41.46339722,-78.99438333,41.46458318,-78.99436234,7.55653 
loop1 
loop2 
2017,5160,41.46399444,-78.99438611,41.46517654,-78.99437141,7.53154 
loop1 
loop2 
2017,5161,41.46459722,-78.99438889,41.46580453,-78.99434083,7.69578 
loop1 

這一個工程.. 我將不得不進行排序和我原本計劃在腳本外,而不是在裏面刪除重複。

#! /usr/bin/awk -f 
BEGIN { 
    while (getline < "s2.txt") { 
     split($0, ft, ",") 
     line = ft[1] 
     station = ft[2] 
     lat1 = ft[3] 
     lon1 = ft[4] 
     while (getline < "data.txt") { 
      split($0, ft, ",") 
      lat2 = ft[11] 
      lon2 = ft[12] 
      ln2 = ft[14] 
      stn2 = ft[15] 

      x = (lon2 - lon1) * cos((lat1 + lat2)/2) 
      y = (lat2 - lat1) 
      d = sqrt(x * x + y * y) * 6371 
      print line","station","lat1","lon1","ln2","stn2","lat2","lon2","d 
     } 

     # edited here 
     close ("data.txt") 

    } 
} 

2017,5155,41.46097500,-78.99436944,2017,5155,41.46104466,-78.99446284,0.656815 
2017,5155,41.46097500,-78.99436944,2017,5156,41.46162354,-78.9943992,4.13473 
2017,5155,41.46097500,-78.99436944,2017,5157,41.46215576,-78.99438806,7.52324 
2017,5156,41.46157778,-78.99437500,2017,5155,41.46104466,-78.99446284,3.42688 
2017,5156,41.46157778,-78.99437500,2017,5156,41.46162354,-78.9943992,0.317363 
2017,5156,41.46157778,-78.99437500,2017,5157,41.46215576,-78.99438806,3.68293 
2017,5157,41.46218611,-78.99437778,2017,5155,41.46104466,-78.99446284,7.28552 
2017,5157,41.46218611,-78.99437778,2017,5156,41.46162354,-78.9943992,3.58585 
2017,5157,41.46218611,-78.99437778,2017,5157,41.46215576,-78.99438806,0.200558 
2017,5158,41.46278611,-78.99438056,2017,5155,41.46104466,-78.99446284,11.103 
2017,5158,41.46278611,-78.99438056,2017,5156,41.46162354,-78.9943992,7.40736 
2017,5158,41.46278611,-78.99438056,2017,5157,41.46215576,-78.99438806,4.01615 
2017,5159,41.46339722,-78.99438333,2017,5155,41.46104466,-78.99446284,14.9938 
2017,5159,41.46339722,-78.99438333,2017,5156,41.46162354,-78.9943992,11.3004 
2017,5159,41.46339722,-78.99438333,2017,5157,41.46215576,-78.99438806,7.90938 

resolv.awk |sort -h -k9 -t, |awk -F',' '!_[$1$2]++' | awk -F',' '!_[$7$8]++' 
2017,5157,41.46218611,-78.99437778,2017,5157,41.46215576,-78.99438806,0.200558 
2017,5156,41.46157778,-78.99437500,2017,5156,41.46162354,-78.9943992,0.317363 
2017,5155,41.46097500,-78.99436944,2017,5155,41.46104466,-78.99446284,0.656815 
+0

'break'位於外部循環中,因此將其打散。也許你的意思是打破內在循環。 – 2012-07-09 01:37:00

+0

如果我打破內部循環,我會從s1.txt的末尾匹配一行。如果我打破了外層循環,我會從s1.txt的開頭匹配一行。同樣沒有休息。似乎getline在內部循環中工作正常,但不在外部循環中,除非內部循環被破壞。 – 2012-07-09 03:11:02

+0

突圍了! – 2012-07-09 04:06:27

回答

0

好像你錯過了close聲明。

#!/usr/bin/awk -f

BEGIN { 
    while (getline < "s1.txt") { 
     split($0, ft, ",") 
     line = ft[1] 
     station = ft[2] 
     lat1 = ft[3] 
     lon1 = ft[4] 

     while (getline < "data.txt") { 
      split($0, ft, ",") 
      lat2 = ft[11] 
      lon2 = ft[12] 

      x = (lon2 - lon1) * cos((lat1 + lat2)/2) 
      y = (lat2 - lat1) 
      d = sqrt(x * x + y * y) * 6371 

      print line","station","lat1","lon1","lat2","lon2","d | "sort -t, -h -k7 |head -1" 

     } 

     # edited here 
     close ("data.txt") 

    } 
} 
+0

解決了循環問題。現在,這是我期望它的工作方式的問題。刪除這種排序可以讓它們全部消失。 – 2012-07-09 15:40:34

+0

'resolv.awk | sort -h -k9 -t,| awk -F',''!_ [$ 1 $ 2] ++'| awk -F',''!_ [$ 7 $ 8] ++' 2017,5157,41.46218611,-78.99437778,2017,5157,41.46215576,-78.99438806,0.200558 2017,5156,41.46157778,-78.99437500,2017,5156, 41.46162354,-78.9943992,0.317363 2017,5155,41.46097500,-78.99436944,2017,5155,41.46104466,-78.99446284,0.656815 ' – 2012-07-09 16:23:54