如何从gdalinfo输出中提取特定信息?

时间:2017-02-28 13:18:50

标签: bash image macos grep gdal

我正在使用GDAL获取有关卫星图像的信息。 stdout如下所示:

$ gdalinfo B02.jp2
Driver: JPEG2000/JPEG-2000 part 1 (ISO/IEC 15444-1)
Files: B02.jp2
       B02.jp2.aux.xml
Size is 10980, 10980
Coordinate System is:
PROJCS["WGS 84 / UTM zone 15N",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AXIS["Latitude",NORTH],
        AXIS["Longitude",EAST],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-93],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32615"]]
Origin = (600000.000000000000000,5400000.000000000000000)
Pixel Size = (10.000000000000000,-10.000000000000000)
...

当我尝试从stdout拉出一行时,会产生错误:

$ gdalinfo B02.jp2 | grep Origin
maximum number of samples exceeded (120560400 > 67108864)
error: cannot decode code stream
Origin = (600000.000000000000000,5400000.000000000000000)

如何从输出中提取信息(例如Origin)并将其分配给变量?

2 个答案:

答案 0 :(得分:2)

您可以GNU grep使用PCRE功能启用-P标记,并仅存储braces()

中匹配的字词
gdalinfo B02.jp2 2>/dev/null | grep -oP 'Origin = \(\K[^\)]+'
600000.000000000000000,5400000.000000000000000

2>/dev/null用于抑制命令中的错误消息。要将它存储在变量中,只需执行,

myOriginInfo="$(gdalinfo B02.jp2 2>/dev/null | grep -oP 'Origin = \(\K[^\)]+')"
printf "%s\n" "$myOriginInfo"

由于您未安装GNU grep,因此您可以使用此POSIX兼容的awk表达式来实现结果,

awk 'BEGIN{FS="[()]"}/Origin/{print $2}' file
600000.000000000000000,5400000.000000000000000

和)变量为

myOriginInfo="$(gdalinfo B02.jp2 2>/dev/null | awk 'BEGIN{FS="[()]"}/Origin/{print $2}')"

答案 1 :(得分:1)

如果您愿意,可以使用bash参数扩展将输出简化为您感兴趣的数据。

$ x=$(gdalinfo B02.jp2 2>/dev/null | grep ^Origin)
$ x="${x#*(}"; x="${x%)}"
$ printf '%s\n' "$x"
600000.000000000000000,5400000.000000000000000

另一个有趣的选择是避免完全使用grep并尝试将您的程序输出解释为字段:

declare -A a       # declare an associative array (requires bash 4)

while IFS="=" read -r key value; do
  [[ -n "$value" ]] && a[${key% }]="${value# }"
done < <(gdalinfo B02.jp2 2>/dev/null)

结果将是一个数组a[],您可以使用它来执行以下操作:

$ printf '%s\n' "${a[Origin]}"
(600000.000000000000000,5400000.000000000000000)

如果您愿意,您当然可以使用参数扩展去掉括号。

$ printf '%s\n' "${a[Origin]:1:$((${#a[Origin]}-2))}"
600000.000000000000000,5400000.000000000000000

请注意,macOS默认安装了bash版本3;如果您想使用bash 4,可以使用MacPortsHomeBrew进行安装。