Linux 如何使用shell将字符串拆分为正确的格式?

Linux 如何使用shell将字符串拆分为正确的格式?,linux,bash,shell,awk,command-line,Linux,Bash,Shell,Awk,Command Line,我有这个文件的持续时间。有些有天,但大部分是以hh:mm的形式。整个表单是dd+hh:mm 我试图将它们“tr-s'+:'':''”转换成dd:hh:mm格式,然后将($1,tm,'':'')计算成秒。 但是,我面临的问题是,在执行此操作后,带有hh:mm的表单将在tm[1]中包含hh,但如果其dd:hh:mm,则tm[1]将是dd。 有没有办法将hh:mm形式的hh放入tm[2]并将tm[1]设为0 4+11:26 10+06:54 20:27 输入是什么 我想要的输出是(以tm[1]、

我有这个文件的持续时间。有些有天,但大部分是以hh:mm的形式。整个表单是dd+hh:mm 我试图将它们“tr-s'+:'':''”转换成dd:hh:mm格式,然后将($1,tm,'':'')计算成秒。 但是,我面临的问题是,在执行此操作后,带有hh:mm的表单将在tm[1]中包含hh,但如果其dd:hh:mm,则tm[1]将是dd。 有没有办法将hh:mm形式的hh放入tm[2]并将tm[1]设为0

4+11:26 
10+06:54 
20:27
输入是什么

我想要的输出是(以tm[1]、tm[2]、tm[3]的形式):


我首先用sed对其进行预处理(在没有加号的行中添加缺少的
0+
),然后将
tr
+:
添加到空格:

cat a.txt | sed 's/^\([^+]\+\)$/0+\1/g' | tr  '+:' '  '
或者按照LAR的建议,更短的
sed
版本:

cat a.txt | sed '/+/! s/^/0+/;' | tr  '+:' '  '

awk
救援

您可以在
awk
中进行转换和计算,使用输入文件将值转换为分钟

$ awk -F: '{if($1~/+/){split($1,f,"+");h=f[1]*24+f[2]}
            else h=$1; m=h*60+$2; print $0 " --> " m}' file

4+11:26  --> 6446
10+06:54  --> 14814
20:27 --> 1227

请显示您的输入和期望的输出。刚刚添加。谢谢你提醒我!我将首先尝试通过插入缺少的天数来规范化输入,然后在sed:
sed'/+/!s/^/0+/;s/[+:]//g;'你的文件确实有用!非常感谢!
$ awk -F: '{if($1~/+/){split($1,f,"+");h=f[1]*24+f[2]}
            else h=$1; m=h*60+$2; print $0 " --> " m}' file

4+11:26  --> 6446
10+06:54  --> 14814
20:27 --> 1227