如何从CSV文件中提取列,并根据提取和处理结果进行处理并创建CSV文件?

问题描述 投票:0回答:1

这是从源 CSV 文件中截取的内容。

%status,date,job,project,start,end,description
%
//,18.03.2021,sib,sib-dede,07:00,15:00,dede-mongo
%
//,11.06.2021,sib,sib-dede,07:00,15:00,dede-mongo
%
//,24.06.2021,sib,sib-dede,07:00,15:00,dede-mongo
%
?,02.08.2021,sib,sib-accounting,14:35,16:35,business-plan
%
?,13.10.2021,sb,sb-accounting,11:30,12:00,e-mail-pump

我喜欢从源 CSV 文件中提取第 5 列中的开始时间和第 6 列中的结束时间。

接下来,根据开始和结束时间,我喜欢以小时或分钟为单位处理持续时间(不介意)。

最终,我喜欢获取源 CSV 文件,在现有的第 6 列和第 7 列之间插入一个新列以及处理的持续时间,并将此添加内容保存在结果 CSV 文件中。

有人知道如何在 GNU Debian Linux 命令行上应对这一挑战吗?

我知道我可以像这样从 CSV 文件中

cut
指定列。

cut -d, -f5,6 < ./source.csv > ./result.csv

但是,我仍然缺少持续时间处理和结果 CVS 文件创建。

PS:我更喜欢 Bash。

PPS:有像this这样的相关问题,但我发现没有一个与这个问题接近。

bash shell debian command-line-interface gnu
1个回答
0
投票

我更喜欢 Bash

但是您可以一次性完成所有操作,例如使用 GNU Awk(假设示例中的

%
符号(或后续换行符)只是一个拼写错误):

awk -F , -v OFS=, '{
  $8=$7; $7=(
    mktime(sprintf("0 0 0 %d %d 0", substr($6,1,2), substr($6,3,2))) - 
    mktime(sprintf("0 0 0 %d %d 0", substr($5,1,2), substr($5,3,2)))
  ) / 60; print
}' source.csv
© www.soinside.com 2019 - 2024. All rights reserved.