Bash 将csv文件第3列中的秒数转换为年龄

Bash 将csv文件第3列中的秒数转换为年龄,bash,awk,seconds,Bash,Awk,Seconds,逗号分隔的csv文件的第三列包含我想转换为年龄的秒数。(样本数据如下)。我正在使用bash生成这些报告,并希望将秒数转换为10d3h20min30sec或类似的时间。有没有一个简单的方法可以做到这一点 谢谢 28126265 6678363 3182862 11401914 1029092 9655690 34381431 13126178 2516335 这是一个可能的解决办法。但不是一条直线 time=28126265 m=60 h=$((m * 60)) d=$((24 * h)) nd

逗号分隔的csv文件的第三列包含我想转换为年龄的秒数。(样本数据如下)。我正在使用bash生成这些报告,并希望将秒数转换为10d3h20min30sec或类似的时间。有没有一个简单的方法可以做到这一点

谢谢

28126265
6678363
3182862
11401914
1029092
9655690
34381431
13126178
2516335

这是一个可能的解决办法。但不是一条直线

time=28126265
m=60
h=$((m * 60))
d=$((24 * h))
nd=$((time / d))
rt=$((time % d))
nh=$((rt / h))
rt=$((rt % h))
nm=$((rt / m))
rt=$((rt % m))
echo ${nd}d ${nh}h ${nm}m ${rt}s  

除非您愿意使用Perl或Python,否则它不会是一行程序

在awk(我不擅长)中,这里有一个解决方案

鉴于:

$ echo "$ages"
28126265
6678363
3182862
11401914
1029092
9655690
34381431
13126178
2516335
你可以做:

echo "$ages" | awk '{
t=int($0);
days=int(t/(24*60*60));
t-=days*24*60*60;
hours=int(t/(60*60));
t-=hours*60*60;
minutes=int(t/60);
seconds=int(t-minutes*60);
printf("%dd %02dh %02dm %02ds\n", days, hours, minutes, seconds);}'
印刷品:

325d 12h 51m 05s
77d 07h 06m 03s
36d 20h 07m 42s
131d 23h 11m 54s
11d 21h 51m 32s
111d 18h 08m 10s
397d 22h 23m 51s
151d 22h 09m 38s
29d 02h 58m 55s
这是另一种方法

awk -v FS="[,]+" '{days=$3/86400;hours=(days-int(days))*24;minutes=(hours-int(hours))*60;seconds=(minutes-int(minutes))*60;print int(days)"d",int(hours)"h",int(minutes)"m",int(seconds)"s"}'
这是明细表

awk -v FS="[,]+" '{
days=$3/86400; #find floating value for days
hours=(days-int(days))*24; #minus floating value from rounded value and multiply by 24 to get floating value for hours
minutes=(hours-int(hours))*60; #minus floating value of hours from rounded value and multiply by 60 to get floating value for minutes
seconds=(minutes-int(minutes))*60; #minus floating value of minutes from rounded value and multiply by 60 to get floating value for seconds
print int(days)"d",int(hours)"h",int(minutes)"m",int(seconds)"s"
}'
输出

325d 12h 51m 4s
77d 7h 6m 3s
36d 20h 7m 41s
131d 23h 11m 53s
11d 21h 51m 32s
111d 18h 8m 10s
397d 22h 23m 50s
151d 22h 9m 37s
29d 2h 58m 55s
使用Perl:

perl-F、-ane'printf“%dd%dh%dm%ds\n”、int($F[2]/(24*60*60))、($F[2]/(60*60))%24、($F[2]/60)%60、$F[2]%60”文件

-a
将每一行自动拆分为数组
@F

-F,
使用逗号作为分隔符自动标记每一行
由于Perl数组从索引0开始,第三个元素是
$F[2]

输入:

a,b,28126265,d,e
a,b,6678363,d,e
a,b,3182862,d,e
a,b,11401914,d,e
a,b,1029092,d,e
a,b,9655690,d,e
a,b,34381431,d,e
a,b,13126178,d,e
a,b,2516335,d,e
输出:

325d 12h 51m 5s
77d 7h 6m 3s
36d 20h 7m 42s
131d 23h 11m 54s
11d 21h 51m 32s
111d 18h 8m 10s
397d 22h 23m 51s
151d 22h 9m 38s
29d 2h 58m 55s
a,b,325d 12h 51m 5s,d,e
a,b,77d 7h 6m 3s,d,e
a,b,36d 20h 7m 42s,d,e
a,b,131d 23h 11m 54s,d,e
a,b,11d 21h 51m 32s,d,e
a,b,111d 18h 8m 10s,d,e
a,b,397d 22h 23m 51s,d,e
a,b,151d 22h 9m 38s,d,e
a,b,29d 2h 58m 55s,d,e
由于要保留现有数据,请执行以下操作:

perl-F、-ane'printf“%s、%dd%dh%dm%ds、%s”、(join“、”、@F[0..1])、int($F[2]/(24*60*60))、($F[2]/(60*60))%24、($F[2]/60)%60、$F[2]%60、(join“、”、@F[3..\F])文件

@F[0..1]
是数组
@F

$#F
是数组
@F

输出:

325d 12h 51m 5s
77d 7h 6m 3s
36d 20h 7m 42s
131d 23h 11m 54s
11d 21h 51m 32s
111d 18h 8m 10s
397d 22h 23m 51s
151d 22h 9m 38s
29d 2h 58m 55s
a,b,325d 12h 51m 5s,d,e
a,b,77d 7h 6m 3s,d,e
a,b,36d 20h 7m 42s,d,e
a,b,131d 23h 11m 54s,d,e
a,b,11d 21h 51m 32s,d,e
a,b,111d 18h 8m 10s,d,e
a,b,397d 22h 23m 51s,d,e
a,b,151d 22h 9m 38s,d,e
a,b,29d 2h 58m 55s,d,e
或者:


perl-F,-ane'$F[2]=sprintf“%dd%dh%dm%ds”、int($F[2]/(24*60*60))、($F[2]/(60*60))%24、($F[2]/60)%60、$F[2]%60;打印加入“,”,@F”文件

您是在寻找脚本还是一行程序?我可以添加到现有脚本中的一行程序会很好…我可以管理类似的内容。我的问题是,这些数据(在您的示例中是年龄)是大型报告的一部分。它是csv文件中的第三列。因此,我需要一种方法来更改数据或写入新文件,但仍保留报告的其余部分1.我不确定我是否理解你的要求。但我使用bash脚本组合3个不同的报告(由性能应用程序创建),然后在发送给用户之前对数据进行处理。我尝试提取数据并使用您的解决方案对其进行格式化,但我无法将其正确地返回到第三列。我用来用临时文件中的格式化数据替换旧数据的awk行正在删除我的所有逗号,我不知道为什么。我知道有一个更简单的方法来实现这一点。。。awk'BEGIN{FS=“,”};FNR==NR{a[NR]=$1;next}{$3=a[FNR]}1'/temp/agesconv.csv./reports/PROD_Age_Report.csvnote我使用$3作为awk来处理文件第3列中的秒数这正是我想要的。它在格式化第三列时保持所有其他列的完整性。。。谢谢你的帮助。。。