在我关于排序CSV文件的问题中,您可以在此处查看: https://stackoverflow.com/a/31290947/2169327
我从@fedorqui得到了一个很好的答案,它给了我以下代码。它基本上只是将匹配坐标的值打印到一个新文件中。
#!/bin/sh
for f in *.out
do
awk -v lat=4 -v lon=3 -v min="69.41 70.39 70.71 69.556 69.8803 68.331146 68.049419 66.871467 68.148436 66.759238 66.175181 65.726251 65.786299 64.890885 62.650539 62.941216 62.785686 62.022545 62.149117 60.813038 59.374231" -v max="70.95 70.86 70.82 72.077 70.370 68.569232 68.241632 72.914490 69.42632 66.870346 66.412593 68.192098 66.001679 65.020729 62.997386 63.098843 62.860798 62.397420 62.388112 61.436394 59.67407" -v minl="27.72 27.69 29.66 13.767 22.3378 16.672046 16.032543 -2.105297 12.237355 13.557573 12.804985 3.572425 12.784130 11.117421 7.916285 7.627894 7.002356 5.977076 5.509247 5.845801 6.037732" -v maxl="28.416 28.73 29.98 23.117 23.7166 17.817370 16.539288 18.043629 15.188618 14.058137 14.329339 13.240394 13.260662 11.632093 8.627650 8.037134 7.250579 7.363814 6.193359 7.963416 6.425000" '
BEGIN {FS=OFS=";"; n=split(min,minlat," "); m=split(max,maxlat," "); h=split(minl, minlong," "); j=split(maxl,maxlong," ")}
{NF--;
for (i=1;i<=n;i++) {
if ($lat>=minlat[i] && $lat<=maxlat[i] && $lon>=minlong[i] && $lon<=maxlong[i])
{print; next}
}
}' $f > ${f%.*}.txt
echo ${f%.*}.txt
done
但是,我真的很想用相同函数中的点替换所有逗号(如在outfile中)。这是因为将要存储这些数据的SQLite接受点作为小数点而不是逗号。
这是我当前的示例输出:
27;2594800;22,35;70,24;14,50;98,00;1391212800;
31;2598;18,76;69,56;230,20;235,00;1391212800;
34;258500;16,58;69,70;18,20;201,00;1391212800;
27;231711000;22,42;70,27;99,20;99,00;1391212800;
答案 0 :(得分:1)
我发现我会这样做:
sub(",",".",$lat);
sub(",",".",$lon);
如果我想替换任何更多的输入,我只需要定义:
awk -v newSubstituteplace=2
sub(",",".",$newSubstituteplace);
要编辑所有输入,我必须执行以下操作:
gsub(",",".")
请参阅下面的评论,了解相关信息,请向他们提供帮助。
答案 1 :(得分:1)
问题是您所在的区域设置使用,
作为小数点。只需更改您的语言环境,例如:
LC_ALL="C" awk '...'
问题就会消失。