如何使用Shell awk实现土地覆盖分类数据集的格式转换?
用Awk转换土地覆盖数据格式
要将你的土地覆盖数据从"X of Y"字符串格式转换为纯数字格式,可以使用下面这个简洁的Awk脚本。它能自动提取每个"X of Y"条目里的数字,并将数据重组为你需要的表格形式。
Awk脚本实现
BEGIN { # 设置输出字段分隔符为空格,保证格式整洁 OFS = " " } { # 原样打印表头行 print $1, $2, $3, $4 # 按每组4个字段处理数据记录(每组对应一条数据) for (idx = 5; idx <= NF; idx += 4) { # 提取土地覆盖类别字段中的数字部分 match($idx, /[0-9]+/) class = substr($idx, RSTART, RLENGTH) # 提取行号字段中的数字部分 match($(idx+1), /[0-9]+/) row = substr($(idx+1), RSTART, RLENGTH) # 提取列号字段中的数字部分 match($(idx+2), /[0-9]+/) col = substr($(idx+2), RSTART, RLENGTH) # 第四个字段已经是数字,直接使用 dist = $(idx+3) # 打印转换后的行 print class, row, col, dist } }
脚本工作原理
- 表头处理:直接打印前四个字段,保留原始表头。
- 数据循环处理:从第5个字段开始,每4个字段为一组(对应一条数据记录),循环处理所有数据。
- 数字提取:对每个"X of Y"格式的字段,用
match()找到第一个连续数字序列,再用substr()提取出这个数字——不管字段有没有引号,这个方法都能生效。 - 输出结果:将提取到的三个数字和原始距离值组合成一行输出。
运行方法
- 将上面的脚本保存为文件,比如
convert_land_cover.awk。 - 针对你的输入文件(比如
input.txt)运行脚本:awk -f convert_land_cover.awk input.txt - 也可以直接在命令行中运行,不用保存脚本:
awk 'BEGIN {OFS = " "} {print $1, $2, $3, $4; for (idx=5; idx<=NF; idx+=4) {match($idx, /[0-9]+/); class=substr($idx,RSTART,RLENGTH); match($(idx+1),/[0-9]+/); row=substr($(idx+1),RSTART,RLENGTH); match($(idx+2),/[0-9]+/); col=substr($(idx+2),RSTART,RLENGTH); dist=$(idx+3); print class, row, col, dist}}' input.txt
示例输出
用你提供的输入数据,运行后会得到如下输出:
land_cover_classes rows columns LandCoverDist 1 1 1 20 1 1 2 0 10 1 4 1 9 110 500 0 1 1 6 354 1 1 7 0 1 1 8 0 1 720 1440 0
内容的提问来源于stack exchange,提问作者Peter Keller




