You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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
    }
}

脚本工作原理

  1. 表头处理:直接打印前四个字段,保留原始表头。
  2. 数据循环处理:从第5个字段开始,每4个字段为一组(对应一条数据记录),循环处理所有数据。
  3. 数字提取:对每个"X of Y"格式的字段,用match()找到第一个连续数字序列,再用substr()提取出这个数字——不管字段有没有引号,这个方法都能生效。
  4. 输出结果:将提取到的三个数字和原始距离值组合成一行输出。

运行方法

  1. 将上面的脚本保存为文件,比如convert_land_cover.awk
  2. 针对你的输入文件(比如input.txt)运行脚本:
    awk -f convert_land_cover.awk input.txt
    
  3. 也可以直接在命令行中运行,不用保存脚本:
    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

火山引擎 最新活动