所以我有一个大的 CSV 文件(70k 行),大约有 60 列。我必须将其中包含纪元时间的列转换为各自的日期。
我有一个有效的脚本。然而,当我在主 CSV 文件上使用它时,需要......很长时间。我实际上并没有让它完全运行,但它每秒处理大约 5 行。
i=1
for line in $(cat data.csv | cut -d, -f11);
do
if [[ $line =~ ^[0-9]{2,}$ ]];
then
day=$(date -r ${line} | cut -d' ' -f1 )
sed_comm="$i""s/$line/$day/"
sed -E -i.bak $sed_comm data.csv
fi
i=$(($i+1))
done
这对于文件的较小版本来说效果很好,但在主版本上需要很长时间。所以我的问题是。有没有一种方法可以做到这一点,而不需要几个小时?
我四处寻找加快速度的方法,但到目前为止还没有任何结果。
我真的只知道 sed 是如何工作的,所以这就是我现在这样做的原因。但如果有人知道一种明显的方法来加快速度,我将不胜感激。
小文件版本:https://ufile.io/3qtcv0hz
注意:在 macOS 上使用 zsh 运行
答案1
使用 GNU awk ( gawk
)假设该文件是“简单”CSV,字段中没有带引号的嵌入式逗号
gawk -F, 'BEGIN{OFS=FS} {$11 = strftime("%c",$11)} 1' file.csv
会将第 11 列从纪元秒转换为您所在区域的首选日期和时间格式 ( %c
)。
与 Miller 类似(能够处理更复杂的 CSV,包括嵌入的逗号):
mlr --csv --implicit-csv-header put '$11 = strftime($11,"%c")' file.csv
有关其他可用的日期时间格式,请参阅man strftime
。