You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Awk筛选文件每第x个数据块及对应同步行输出到新文件

解决方案

需求1:提取每第N个数据块

你的数据块为固定长度结构,每个块占7行:首行是固定值6,第二行是时间步元数据,后续6行为坐标数据,无需依赖空行即可完成切分。
使用以下awk命令即可提取每第x个数据块,可通过修改x=100自定义提取间隔:

awk -v x=100 '
BEGIN{block=0; line_in_block=0}
{
    if(line_in_block == 0) {
        block++
        need_print = (block % x == 0) ? 1 : 0
    }
    if(need_print) print $0
    line_in_block++
    if(line_in_block == 7) line_in_block = 0
}
' 原始数据文件 > 提取后的数据文件

需求2:同步提取关联文件并校验

以下脚本可同时处理原始数据文件与关联文件,自动匹配对应时间步并完成一致性校验,不匹配的情况会输出警告到错误流:

awk -v x=100 '
ARGIND == 1 {
    if(line_in_block == 0) {
        block++
        need_save = (block % x == 0) ? 1 : 0
        need_print_data = 0
    }
    if(need_print_data) print $0 > "filtered_data.txt"
    if(line_in_block == 1 && need_save) {
        i_val = $3
        gsub(/,/,"",i_val)
        time_val = $6
        gsub(/,/,"",time_val)
        target[i_val] = time_val
        need_print_data = 1
    }
    line_in_block++
    if(line_in_block == 7) line_in_block = 0
    next
}
ARGIND == 2 {
    i_file = $1
    time_file = $2
    if(target[i_file] == time_file) {
        print $0 > "filtered_associate.txt"
        delete target[i_file]
    } else if(target[i_file] != "") {
        print "警告:i="i_file" 时间不匹配,数据块值为"target[i_file]",关联文件值为"time_file > "/dev/stderr"
    }
}
END{
    if(length(target) > 0) {
        print "警告:以下i值在关联文件中未找到匹配行:" > "/dev/stderr"
        for(i in target) print "i="i", time="target[i] > "/dev/stderr"
    }
}
' 原始数据文件 关联文件
  • 输出的filtered_data.txt为提取后的数据块文件,filtered_associate.txt为对应匹配的关联文件行
  • 校验规则:
    1. 校验时间步i值一致性
    2. 校验对应i的time值一致性
    3. 校验所有待提取的时间步都在关联文件中存在对应行
  • 如果系统不支持gawk的ARGIND参数,可将ARGIND == 1替换为FILENAME == ARGV[1],ARGIND == 2替换为FILENAME == ARGV[2]即可。

内容的提问来源于stack exchange,提问作者Ant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:15:03