如何从 gdalinfo 输出中提取特定信息?
How to extract specific information from gdalinfo output?
我正在使用 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
)并将其分配给变量?
您可以使用 GNU grep
及其由 -P
标志启用的 PCRE
功能,并仅存储 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 }' file
600000.000000000000000,5400000.000000000000000
and) 在变量中为
myOriginInfo="$(gdalinfo B02.jp2 2>/dev/null | awk 'BEGIN{FS="[()]"}/Origin/{print }')"
如果愿意,您可以使用 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,你可以使用 MacPorts or HomeBrew.
安装它
我正在使用 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
)并将其分配给变量?
您可以使用 GNU grep
及其由 -P
标志启用的 PCRE
功能,并仅存储 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 }' file
600000.000000000000000,5400000.000000000000000
and) 在变量中为
myOriginInfo="$(gdalinfo B02.jp2 2>/dev/null | awk 'BEGIN{FS="[()]"}/Origin/{print }')"
如果愿意,您可以使用 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,你可以使用 MacPorts or HomeBrew.
安装它