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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 23:03:02