Join CSV file to shapefile using gdal/ogr
The ogr2ogr utility supports a limited sql syntax. You can join your CSV to the shapefile using something like the following:
ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp
The accepted answer is really useful, but I found that it was slow with a large-ish database. I believe it also limits your options when joining the data.
My method now is to pull everything into SQLite (using a combination of csvkit and ogr2ogr):
csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp
Then join everything and create a shapefile out of it:
ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db