我的输入是一个制表符分隔的文本文件,其中lat为long.我要求输出是十进制度我在PHP中有代码,但这是非常慢的计算.使用awk可以更快地完成吗?
node name id latitude longitude seq
nodex name1 70 N53-24-31.126 W6-20-46.982 59126
nodex name2 173 N53-20-28.885 W6-14-52.400 16190X
nodex name3 173 N53-20-28.885 W6-14-52.400 16191T
Run Code Online (Sandbox Code Playgroud)
我的PHP代码与公式:
if ($dirLat == 'N') {$signLat = '+';} Else {$signLat = '-';}
if ($dirLat == 'E') {$signLon = '+';} Else {$signLon = '-';}
$latitudeDecimalDeg = $signLat . ($degLat + ($minLat/60) + ($secLat/3600));
$longitudeDecimalDeg = $signLon . ($degLon + ($minLon/60) + ($secLon/3600));
Run Code Online (Sandbox Code Playgroud)
我很确定awk会更快.这很容易用awk完成,用substr和拆分每个字段split.我把它变成了一个更容易重用的函数:
function dms2deg(s) {
dir = (substr(s, 1, 1) ~ /^[NE]/) ? 1 : -1
dms = substr(s, 2)
split(dms, arr, "-")
return dir * (arr[1] + arr[2]/60 + arr[3]/3600)
}
Run Code Online (Sandbox Code Playgroud)
如果您已将上述内容放入dms2deg并且数据处于infile状态,那么您将使用这样的awk:
awk -f dms2deg -e 'NR>1 { print dms2deg($4), dms2deg($5) }' infile
Run Code Online (Sandbox Code Playgroud)
输出:
53.4086 -6.34638
53.3414 -6.24789
53.3414 -6.24789
Run Code Online (Sandbox Code Playgroud)
或者,如果要替换现有字段:
awk -f dms2deg -e 'NR>1 { $4 = dms2deg($4); $5 = dms2deg($5) } $1=$1' infile
Run Code Online (Sandbox Code Playgroud)
输出:
node name id latitude longitude seq
nodex name1 70 53.4086 -6.34638 59126
nodex name2 173 53.3414 -6.24789 16190X
nodex name3 173 53.3414 -6.24789 16191T
Run Code Online (Sandbox Code Playgroud)
请注意,这不会保留空白区域,但column会考虑到这一点:
awk -f dms2deg -e 'NR>1 { $4 = dms2deg($4); $5 = dms2deg($5) } $1=$1' infile | column -t
Run Code Online (Sandbox Code Playgroud)
输出:
node name id latitude longitude seq
nodex name1 70 53.4086 -6.34638 59126
nodex name2 173 53.3414 -6.24789 16190X
nodex name3 173 53.3414 -6.24789 16191T
Run Code Online (Sandbox Code Playgroud)