Фильтрация координат в заданном диапазоне

У меня есть сотни файлов .out с географическими позициями, которые я буду импортировать в базу данных SQLite. Однако, чтобы сэкономить время, я буду импортировать линию с географическими координатами через определенные промежутки времени.

Файл выглядит следующим образом:

value;value;longitude;latitude;value;value value;value;longitude;latitude;value;value 

Поэтому все, что не внутри нескольких широт, и интервалы долготы должны быть удалены из файла.

 for f in *.out do for each line in $f: if not longitude >= longitude1 and longitude <= longitude2 or longitude >= longitude3 and longitude <= longitude4 or longitude>=longitude5 and longitude<=4: delete line 

Я включил псевдокод, чтобы показать некоторые усилия, но как бы это сделать в Bash, awk, python или в том, что когда-либо было самым быстрым.

Долгота и широта – это третье и четвертое значение здесь. У меня 21 интервал широты, f.ex 69.41 до 70.95 (широта).

Пример ввода

 63;543534;34,12;59,43;22,80;654,324;139543; 63;25725;5,11;59,43;22,80;36,00;1391212800; 61;5382189;3,66;60,93;68,00;158,00;1391212800; 43;25977000;10,72;67,51;170,70;168,00;1391212800; 61;2000;4,54;60,00;352,50;352,00;1391212800; 53;2504210;6,96;62,89;289,40;511,00;1391212800; 27;2594800;22,35;70,24;14,50;98,00;1391212800; 61;257900;5,13;60,13;321,10;195,00;1391212800; 31;2598;18,76;69,56;230,20;235,00;1391212800; 63;44000;5,84;59,01;226,90;227,00;1391212800; 61;0;4,96;60,57;125,50;129,00;1391212800; 57;2575000;4,88;61,77;113,00;276,00;1391212800; 34;258500;16,58;69,70;18,20;201,00;1391212800; 243;217000;7,18;65,25;283,00;145,00;1391212800; 243;21900;7,20;64,97;44,80;109,00;1391212800; 243;2190516;2,44;58,20;270,50;121,00;1391212800; 243;22000;1,94;58,39;305,20;130,00;1391212800; 243;231067000;1,87;58,09;12,00;122,00;1391212800; 243;311000150;3,54;61,13;166,30;332,00;1391212800; 243;257282000;7,21;64,97;267,10;112,00;1391212800; 243;232758000;1,77;61,43;333,30;337,00;1391212800; 27;231711000;22,42;70,27;99,20;99,00;1391212800; 68;231770000;10,06;58,74;5,40;10,00;1391212800; 

Желаемый выход с интервалом широты от 69,41 до 70,95:

 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; 

Обратите внимание, что это предпочтительно должно быть либо записано в новый файл, либо перезаписать существующий файл.

  • Оператор возврата класса не печатает какой-либо вывод
  • Python и SQLite: проверьте, существует ли элемент в базе данных?
  • Установка OSQA на окна (локальная система)
  • Есть ли бесплатный отладчик python с точками наблюдения?
  • Печать всех дат между двумя датами
  • Как документировать константу модуля в Python?
  • Не удалось импортировать пользовательскую DLL в python
  • Работа в режиме реального времени через Python
  • One Solution collect form web for “Фильтрация координат в заданном диапазоне”

    Если у вас есть только один интервал для проверки, передайте их и сравните:

     awk -v lat=5 -v min_lat=69.41 -v max_lat=70.95 ' BEGIN {FS=OFS=";"} {sub(",",".",$lat)} $lat>=min_lat && $lat<=max_lat' file 

    С lat я указываю столбец широты, поскольку он изменяется в ваших изменениях. Обратите внимание, что поля имеют запятую для разделения десятичных знаков, поэтому я заменяю их точкой.

    Контрольная работа

     $ awk -v lat=5 -v min_lat=69.41 -v max_lat=70.95 'BEGIN {FS=OFS=";"} {sub(",",".",$lat)} $lat>=min_lat && $lat<=max_lat' file 27;1;2594800;22,35;70.24;14,50;98,00;1391212800; 31;3;2598;18,76;69.56;230,20;235,00;1391212800; 34;3;258500;16,58;69.70;18,20;201,00;1391212800; 27;1;231711000;22,42;70.27;99,20;99,00;1391212800; 

    Если у вас много значений min и max, передайте их как строку и нарежьте их, чтобы вы могли проверить их в массиве:

     awk -v lat=4 -v min="69.41 70.39" -v max="70.95 70.86" ' BEGIN {FS=OFS=";"; n=split(min,minlat," "); m=split(max,maxlat," ")} {sub(",",".",$lat); for (i=1;i<=n;i++) { if ($lat>=minlat[i] && $lat<=maxlat[i]) {print; next} } }' file 

    Это считывает интервалы в массиве minlat[] и maxlat[] а затем сравнивает широту со всеми парами (minlat[1], maxlat[1]), (minlat[2], maxlat[2]), ... , Если он соответствует, он печатает запись и переходит к следующему, чтобы предотвратить печать более одного раза.

    Контрольная работа

     $ awk -v lat=4 -v min="69.41 70.39" -v max="70.95 70.86" 'BEGIN {FS=OFS=";"; n=split(min,minlat," "); m=split(max,maxlat," ")} {sub(",",".",$lat); for (i=1;i<=n;i++) {if ($lat>=minlat[i] && $lat<=maxlat[i]) {print; next}}}' file 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; 
    Python - лучший язык программирования в мире.