Unix系统下如何修改csv.bz2文件指定日期列格式并更新文件
可行实现方案
bz2属于流式压缩格式,无法直接原位修改文件内容,通用处理逻辑为「解压文件→修改指定列→重新压缩生成新文件→替换原文件」,操作前建议先备份原文件避免数据丢失。
步骤1:备份原文件
先执行备份操作,防止处理出错导致原始数据损坏:
cp OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2 OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2.bak
步骤2:批量处理日期字段并生成新压缩文件
使用awk处理列性能最优,适合百万级记录的大文件,完整命令如下:
bzcat OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2 | awk ' BEGIN { FS=";" OFS=";" } # 表头行直接输出不处理 NR == 1 { print next } # 处理数据行的第30、31列 { # 处理第30列end_time:格式从yyyy/mm/dd HH:MM转为dd/mm/yy HH:MM split($30, dt_arr, " ") split(dt_arr[1], date_part, "/") $30 = date_part[3] "/" date_part[2] "/" substr(date_part[1],3,2) " " dt_arr[2] # 处理第31列start_time,逻辑同上 split($31, dt_arr, " ") split(dt_arr[1], date_part, "/") $31 = date_part[3] "/" date_part[2] "/" substr(date_part[1],3,2) " " dt_arr[2] print } ' | bzip2 -c > processed_temp.csv.bz2
命令说明:
FS=";"和OFS=";"指定输入输出的列分隔符为分号- 拆分日期字段时先按空格拆分出日期和时间部分,再按
/拆分年月日,重组后取年份的后两位拼接成目标格式 bzip2 -c将处理后的内容输出到标准流,写入临时压缩文件
步骤3:验证结果并替换原文件
先核对处理后的数据是否符合预期:
# 查看前20行的第30、31列格式是否正确 bzcat processed_temp.csv.bz2 | head -20 | awk -F';' '{print $30, $31}'
确认格式无误后替换原文件:
mv processed_temp.csv.bz2 OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2
注意事项
- 如果你的CSV字段存在被引号包裹、内部包含分号的情况,按分号直接拆分列会出错,这种情况可以使用
csvkit等专用CSV处理工具配合操作,如果你之前通过sed拆分表头能正确定位到列位置,说明不存在这类异常字段,以上命令可以直接使用 - 百万级记录处理耗时取决于机器性能,awk处理效率很高,无需担心性能问题
内容的提问来源于stack exchange,提问作者alejomarchan
相关产品推荐
相关产品推荐

