Добавление всех dbf в папку к первому dbf с помощью скрипта bash

Я пытаюсь добавить все dbf в папке к первому dbf. dbfs являются частью шейп-файлов ESRI, которые я хочу добавить в один файл. У меня есть рабочий код, но я думаю, что то, что я сделал, действительно неуклюже (я абсолютный новичок в bash)... И когда я опускаю первый файл, мой счетчик считает один лишний файл в конце цикла и выдает ошибку .. Добавление выполняется ogr2ogr (библиотека GDAL/OGR)

mydir=C:/Users/Kay/Desktop/Test_GIS/new/
cd $mydir

dbfs=(*.dbf)                                # put dir to array

let i=1                                     # start with 1 omitting 1st file with index 0

for f in *.dbf 
  do       
  echo appending file ${dbfs[i]} to ${dbfs[0]}
  ogr2ogr -append ${dbfs[0]} ${dbfs[i]}
  let i=i+1                                 # counter + 1
done

person Kay    schedule 30.04.2013    source источник


Ответы (2)


Версия A: вы явно указываете, к какому dbf хотите добавить

append_to="fff.dbf"
find . -maxdepth 1 -name \*.dbf -print0 | grep -zv "^$append_to$" | xargs -0 -n1 -I % echo ogr2ogr -append "$append_to" "%"

Вариант B: добавление к 1-му dbf (1-й по ls)

append_to=$(ls -1 *.dbf | head -1)
find . -maxdepth 1 -name \*.dbf -print0 | grep -zv "^$append_to$" | xargs -0 -n1 -I % echo ogr2ogr -append "$append_to" "%"

Оба сейчас в режиме "пробного прогона" - только показывает, что будет делать. Когда все будет удовлетворено, удалите echo из xargs. Вторая строка одинакова для обеих версий.

чистый удар

IFS=$'\t\n'       #don't need this line when your filenames doesn't contain spaces
declare -a dbfs=(*.dbf)
unset $IFS        #don't need this line when your filenames doesn't contain spaces
append_to=${dbfs[0]}
unset dbfs[0]
for dbf in ${dbfs[@]}
do
        echo ogr2ogr -append "$append_to" "$dbf"
done
person jm666    schedule 30.04.2013
comment
Я иду с последним подходом - спасибо и +1. Однако для тех, кто использует это с ogr2ogr, проверьте дополнительный ответ, который я опубликовал для записи! - person Kay; 02.05.2013
comment
Вы нашли лучшее решение для себя. Я впервые услышал о ogr2ogr здесь... так что спасибо за согласие :) - person jm666; 02.05.2013

Для записи

Если вы используете ogr2ogr для добавления dbf к шейп-файлам, все на самом деле намного проще. Если вы передаете имя shp-файла, которого еще не существует, он создает пустой шейп-файл на лету и добавляет к нему данные. Итак, этого будет достаточно:

# working directory with shp-files to be appended into one file
mydir=D:/GIS_DataBase/CorineLC/shps_extracted
cd $mydir

# directory where final shp-file will be saved
mydir_final=D:/GIS_DataBase/CorineLC/shps_app_and_extr
mkdir $mydir_final

# get dbfs, which are the actual files to which append the data to
declare -a dbfs=(*.dbf)

# loop through dbfs in dir and append all to the dbf of shp-file
# extr_and_app.shp that will be created by ogr2ogr on the fly 
# and saved to {mydir_final}
for dbf in ${dbfs[@]}; do
  echo appending $dbf to $mydir_final/extr_and_app.dbf
  ogr2ogr -append $mydir_final/extr_and_app.dbf $dbf
done
person Kay    schedule 01.05.2013