gpt4 book ai didi

linux - 如何在 csv.bz2 中更改日期格式列并在 Unix 中更新文件

转载 作者:行者123 更新时间:2023-12-04 07:20:01 29 4
gpt4 key购买 nike

我有一个包含数百万条记录的 bz2 压缩 csv 文件。第一行包含文件头。
我有多个日期列,但只有两个特定的列需要更改为
从 yyyy/mm/dd hh24:mm 格式化日期并将其设置为 dd/mm/yy hh24:mm 并更新 csv.bz2 文件。
我正在用 awk 进行研究,这个

bzcat OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2 |
head -1 | sed 's /; / \ n / g' | nl
我设法找到了需要重新格式化的列的位置:
  1  playtime
2 traffic
.
.
30 end_time
31 start_time
.
.
122 playback_id
每行的输出例如:
0.0;0.0;;0.0;0;;0.0;0;0.0;0.0;7.0;-1.0;0.0;0.0;0;0;0;0;0;0;0;0;0.0;0.0;0.0;;;0.0;0.0;2021/05/11 17:52;2021/05/11 17:52;0.0;Argentina;;;;LATAM;Unknown;WIFI;Undefined;;Undefined;Streaming;TELEFE;N/A - Multicast;;LIVE;;STB;;;;;;;;Not reported;;;29_2255508521_1620777131852;{"channel_id": 3346, "channel_name": "TELEFE", "channel_number": null, "delaytime": null, "dist_id": null, "player_session_name": null, "playtime": null, "program_id": 500508915, "resolution": "HD", "device_version": "2020.06.26.00.08.27", "ip": "10.241.164.84", "ob": "29", "device_type": null, "user_id": "17059165", "device_id": "2255508521", "operation": "LIV/channel-change", "transaction_id": "476707713_2255508521_29", "status": null, "timestamp": "2021-05-11T20:52:11.852-03:00", "bit_rate": "7Mbps", "qoe_sessionId": null, "type_event": null};;;;;N/A;17059165;;10.241.164.84;IPv4;29;HD;;;;;;;;;WIFI;DTV;IPTV;2255508521;0;4D535443;BA-ICS42-GPON;CEICS02;SCSJS01;RCSJS01;;;;;;0;0;0;0;0;0;0;0;3.0.11;1280x720@60p;N/A;2020.06.26.00.08.27;5263162195;LiveTV;N/A;;;1;ALL;VIP4242W;239.130.1.0:22220;0;0;;;EBVS;;
在这种情况下将是 30 和 31,但我找不到如何更新文件中的那对字段。有什么建议吗?

最佳答案

您不能直接编辑 bz2 压缩文件,实现您所要求的我能想到的唯一方法是:

bzcat OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2 | awk 'BEGIN{FS=OFS=";"}{$30=gensub(/^..(..)\/(..)\/(..)(.*)$/, "\\3/\\2/\\1\\4","1",$30);$31=gensub(/^..(..)\/(..)\/(..)(.*)$/, "\\3/\\2/\\1\\4","1",$31);print }' | bzip2 > OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2.tmp
mv OBACountryIPTV_OBACountryIPTV_CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2.tmp CALICUX_Report_Session_Local_Timezone_2021-07-02_000000.csv.bz2 #if the size looks right and you verified the content has changed as expected.
我确信使用 awk 进行重新排列有更简单/更有效的方法;还要注意 gensub GNU awk 扩展而不是 POSIX 兼容。
awk部分说明: BEGIN{FS=OFS=";"} - 告诉 awk ;是字段分隔符。 $30=gensub(/^..(..)\/(..)\/(..)(.*)$/, "\\3/\\2/\\1\\4","1",$30) - 解析第 30 个字段(第一个不需要的日期格式字段), ^..匹配年份的世纪部分, (..)捕获年份和十年,随后的分别捕获月和日。 (.*)然后捕捉时间。 "\\3/\\2/\\1\\4"使用捕获的组重建时间和日期(它们按照捕获的顺序编号,因此 \\1 匹配年份的最后两位数字)并将值重新分配给第 30 个字段。
然后我们只需对第 31 个字段重复相同的过程。

关于linux - 如何在 csv.bz2 中更改日期格式列并在 Unix 中更新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68563274/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com