在bash中以前导0递增一个数字
我是bash脚本的新手,我正在尝试编写一些代码来解析和操作我正在处理的文件 我需要在一个文件中增加和减少一个时间的分钟数。我的问题发生在例如2:04或14:00的时间 文件示例:在bash中以前导0递增一个数字,bash,shell,variables,if-statement,Bash,Shell,Variables,If Statement,我是bash脚本的新手,我正在尝试编写一些代码来解析和操作我正在处理的文件 我需要在一个文件中增加和减少一个时间的分钟数。我的问题发生在例如2:04或14:00的时间 文件示例: 2:43 2:05 15:00 我当前从bash脚本中摘录的内容如下 for x in `cat $1`; do minute_var=$(echo $x | cut -d: -f2); incr_min=$(($minute_var + 1 | bc)); echo $incr_min; done 当
2:43
2:05
15:00
我当前从bash脚本中摘录的内容如下
for x in `cat $1`;
do minute_var=$(echo $x | cut -d: -f2);
incr_min=$(($minute_var + 1 | bc));
echo $incr_min;
done
当前结果:
44
6
1
所需结果:
44
06
01
有什么建议吗这符合你的要求吗
kent$ echo "2:43
2:05
15:00"|awk -F: '{$2++;printf "%02d\n", $2}'
44
06
01
这符合你的要求吗
kent$ echo "2:43
2:05
15:00"|awk -F: '{$2++;printf "%02d\n", $2}'
44
06
01
使用
printf
:
incr_min=$(printf %02d $(($minute_var + 1 )) )
不,如果只涉及整数,则不需要使用
bc
。使用printf
:
incr_min=$(printf %02d $(($minute_var + 1 )) )
不,如果只涉及整数,则不需要使用
bc
。使用printf
将输出重新格式化为零填充、2宽:
incr_min=$(printf %02d $incr_min)
使用
printf
将输出重新格式化为零填充、2宽:
incr_min=$(printf %02d $incr_min)
使用0填充,并获取最后两个字符:
for x in `cat $1`;
do minute_var=$(echo $x | cut -d: -f2);
incr_min=0$(($minute_var + 1 | bc));
echo ${incr_min: -2:2};
done
使用0填充,并获取最后两个字符:
for x in `cat $1`;
do minute_var=$(echo $x | cut -d: -f2);
incr_min=0$(($minute_var + 1 | bc));
echo ${incr_min: -2:2};
done
已更新#2
你的脚本有一些问题。首先,您不应该使用`cat file`
而应该使用`UPDATED#2
你的脚本有一些问题。首先,您应该使用`
对于从一分钟到下一小时的换行,请使用带有时间函数的语言,如gawk
awk -F: '{
time = mktime("1970 01 01 " $1 " " $2 " 00")
time += 60
print strftime("%M", time)
}'
对于从一分钟到下一小时的换行,请使用带有时间函数的语言,如gawk
awk -F: '{
time = mktime("1970 01 01 " $1 " " $2 " 00")
time += 60
print strftime("%M", time)
}'
这里有一个解决方案
- 将秒数从59缩短到0
- 是完全兼容POSIX的--没有bashisms李>
- 不需要一个叉子,因此速度非常快
$cat x
2:43
2:05
2:08
2:09
15:00
15:59
$while IFS=:读取小时最小值;做
printf“%02d\n”$((${min#0}+1)%60))
完成
这里有一个解决方案
- 将秒数从59缩短到0
- 是完全兼容POSIX的--没有bashisms李>
- 不需要一个叉子,因此速度非常快
$cat x
2:43
2:05
2:08
2:09
15:00
15:59
$while IFS=:读取小时最小值;做
printf“%02d\n”$((${min#0}+1)%60))
完成
试试这个:
for x in $(<$1); do
printf "%02d\n" $(((${x#*:}+1)%60));
done
对于x(单位:美元)(请尝试以下操作:
for x in $(<$1); do
printf "%02d\n" $(((${x#*:}+1)%60));
done
对于x in$(即使在bash中,一个很好的做法是将视图和模型分开。数字的显示方式不应该干扰它们的递增方式。只是出于好奇,59可以递增到60,还是应该包装到00?不需要昂贵的管道和分叉:minute_var=${x#*:}
删除所有内容,包括第一个:
@Jens:使用可以跳过${x*:}
,而IFS=:read hr min;do
。分钟将直接读取到min
。无需使用任何外部实用程序(无cat
、cut
或bc
)。即使在bash中,一个好的做法是将视图和模型分开。数字的显示方式不应干扰它们的递增方式。只是出于好奇,59可以递增到60,还是应该换行到00?不需要昂贵的管道分叉:minute_var=${x#*:}
删除所有内容,包括第一个:
@Jens:即使${x#*:}
也可以使用跳过,而IFS=:read hr min;do
。会议记录将直接读取到min
。无需使用任何外部实用程序(无cat
、cut
或bc
)。感谢$:}
idea。但不需要调用任何外部实用程序,如cat
、cut
和bc
。需要时不引用,有很多不必要的管道,忽略了做得更好的内置shell功能。@CharlesDuffy,我所做的是修改原始问题中的代码,以显示解决问题的方法问题在于。我的修改使用的是内置的shell功能,而不是管道。即使它们使用了管道,但同时使用不同的工具来解决问题也没有任何问题。事实上,这就是*nix方式。@Atle PIPIPING tobc
使用外部工具来完成以前在bash内部完成的工作。因为它是在子shell中,它需要一个fork()
调用、一个exec()
、一个read()
,等等,否则效率会非常低。UNIX方式需要使用许多在同一个(流)上操作的工具接口,是的——但这并不是效率低下的借口。@ATL不仅仅是我的愤怒。把代码带到freenode的#bash,看看大家怎么想。谢谢${::}
idea。但不需要调用任何外部实用程序,如cat
、cut
和bc
。需要时不引用,有很多不必要的管道,忽略了做得更好的内置shell功能。@CharlesDuffy,我所做的是修改原始问题中的代码,以显示解决问题的方法问题在于。我的修改使用的是内置的shell功能,而不是管道。即使它们使用了管道,但同时使用不同的工具来解决问题也没有任何问题。事实上,这就是*nix方式。@Atle PIPIPING tobc
使用外部工具来完成以前在bash内部完成的工作。因为它是在子shell中,它需要一个fork()
调用、一个exec()
、一个read()
,等等,否则效率会非常低。UNIX方式需要使用许多在同一个(流)上操作的工具接口,是的,但它不是效率低下的借口。@Atle不仅仅是我的愤怒。将该代码带到freenode的bash,看看人们怎么想。实际上,printf
也是一个外部实用程序。在这种情况下也不需要它。您将遇到八进制问题——用时间“8:08”进行测试。您需要$(10#$minute var+1))
@TrueY,printf
是bash内置的——请参见type-a printf
@glennjackman:是的!你说得对
for x in $(<$1); do
printf "%02d\n" $(((${x#*:}+1)%60));
done