如何按日期列拆分带分号分隔符的大文件并生成指定格式的输出文件
分号分隔大文件按日期列拆分AWK解决方案
需求说明
针对分号作为分隔符、自带表头、日期列按升序排列的大文件,按日期列拆分文件,输出文件名格式为01_XX_YYMMDD_YYMMDD.txt。
输入示例
--INPUT K;V1.00;;;;;; P;01.01.2021 00:01;16;EXA;31;TESTA;95.9;XXXX P;01.01.2021 00:02;33;EXA;31;TESTA;95.9;XYXY P;02.01.2021 00:54;16;EXB;33;TESTB;94.0;DWAD P;02.01.2021 00:56;11;EXB;33;TESTB;94.0;DADA P;03.01.2021 01:00;16;EXC;32;TESTC;94.6;WEWEQ P;03.01.2021 01:22;16;EXC;32;TESTC;94.6;QEQR P;04.01.2021 02:39;16;EXD;33;TESTD;94.3;DFAG
预期输出示例
拆分后生成对应日期的独立文件,每个文件仅包含对应日期的行:
- 文件1:
01_XX_210101_210101.txt,包含2条2021年1月1日的记录 - 文件2:
01_XX_210102_210102.txt,包含2条2021年1月2日的记录 - 文件3:
01_XX_210103_210103.txt,包含2条2021年1月3日的记录 - 文件4:
01_XX_210104_210104.txt,包含1条2021年1月4日的记录
可用AWK脚本
awk -F';' ' NR > 1 { dt = substr($2,9,2) substr($2,4,2) substr($2,1,2) print > ("01_XX_" dt "_" dt ".txt") }' 你的输入文件名
脚本说明
-F';'指定分号为字段分隔符,适配文件格式NR > 1跳过第一行表头,仅处理数据行- 日期转换逻辑:输入的日期格式为
DD.MM.YYYY HH:MM,通过substr函数分别截取年份后两位(第9位开始取2位)、月份(第4位开始取2位)、日期(第1位开始取2位),拼接为YYMMDD格式 - 每行处理完成后直接写入对应命名的输出文件,因为原文件日期已按升序排列,无需额外排序逻辑
优化版本(拆分文件保留表头)
如果需要把原文件表头写入每个拆分后的文件,同时避免大文件处理时打开过多文件句柄报错,可以使用以下版本:
awk -F';' ' NR == 1 {header = $0; next} { dt = substr($2,9,2) substr($2,4,2) substr($2,1,2) fname = "01_XX_" dt "_" dt ".txt" if (prev != dt) { if (prev) close(prev_fname) print header > fname prev = dt prev_fname = fname } print > fname }' 你的输入文件名
内容的提问来源于stack exchange,提问作者Djabone
相关产品推荐
相关产品推荐

