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
'break'位於外部循環中,因此將其打散。也許你的意思是打破內在循環。 – 2012-07-09 01:37:00
如果我打破內部循環,我會從s1.txt的末尾匹配一行。如果我打破了外層循環,我會從s1.txt的開頭匹配一行。同樣沒有休息。似乎getline在內部循環中工作正常,但不在外部循環中,除非內部循環被破壞。 – 2012-07-09 03:11:02
突圍了! – 2012-07-09 04:06:27