使用awk按相同时间戳重排多文件数据的需求及问题
合并两个文件中同时间戳的数据集(Awk实现)
核心思路
用Awk数组存储每个时间戳对应的完整数据集(1行时间戳+5行关联数据),以14位时间戳为键,对应所有行内容为值。处理完两个文件后,按时间戳升序输出每个时间戳的所有对应数据集。
实现脚本
将以下代码保存为merge_ts.awk:
BEGIN { block_lines = 6 # 每个数据集总行数:1行时间戳 + 5行关联数据 } # 匹配14位数字开头的时间戳行,标记当前处理的时间戳 /^[0-9]{14}$/ { current_ts = $0 data[current_ts] = current_ts "\n" line_count = 0 next } # 收集时间戳后的5行关联数据 current_ts != "" && line_count < block_lines - 1 { data[current_ts] = data[current_ts] $0 "\n" line_count++ if (line_count == block_lines - 1) { current_ts = "" # 收集完成,重置标记 } } END { # 按时间戳字符串升序排序输出 PROCINFO["sorted_in"] = "@ind_str_asc" for (ts in data) { printf "%s", data[ts] } }
运行方式
在终端执行以下命令:
awk -f merge_ts.awk file1.txt file2.txt
测试示例
假设file1.txt内容:
20240520120000 data1-1 data1-2 data1-3 data1-4 data1-5 20240520130000 data2-1 data2-2 data2-3 data2-4 data2-5
file2.txt内容:
20240520120000 dataA-1 dataA-2 dataA-3 dataA-4 dataA-5 20240520140000 dataB-1 dataB-2 dataB-3 dataB-4 dataB-5
运行后输出:
20240520120000 data1-1 data1-2 data1-3 data1-4 data1-5 20240520120000 dataA-1 dataA-2 dataA-3 dataA-4 dataA-5 20240520130000 data2-1 data2-2 data2-3 data2-4 data2-5 20240520140000 dataB-1 dataB-2 dataB-3 dataB-4 dataB-5
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

