使用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为对应匹配的关联文件行 - 校验规则:
- 校验时间步i值一致性
- 校验对应i的time值一致性
- 校验所有待提取的时间步都在关联文件中存在对应行
- 如果系统不支持gawk的
ARGIND参数,可将ARGIND == 1替换为FILENAME == ARGV[1],ARGIND == 2替换为FILENAME == ARGV[2]即可。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

