在bash中以前导0递增一个数字

在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 当

我是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
当前结果:

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 to
bc
使用外部工具来完成以前在bash内部完成的工作。因为它是在子shell中,它需要一个
fork()
调用、一个
exec()
、一个
read()
,等等,否则效率会非常低。UNIX方式需要使用许多在同一个(流)上操作的工具接口,是的——但这并不是效率低下的借口。@ATL不仅仅是我的愤怒。把代码带到freenode的#bash,看看大家怎么想。谢谢
${::}
idea。但不需要调用任何外部实用程序,如
cat
cut
bc
。需要时不引用,有很多不必要的管道,忽略了做得更好的内置shell功能。@CharlesDuffy,我所做的是修改原始问题中的代码,以显示解决问题的方法问题在于。我的修改使用的是内置的shell功能,而不是管道。即使它们使用了管道,但同时使用不同的工具来解决问题也没有任何问题。事实上,这就是*nix方式。@Atle PIPIPING to
bc
使用外部工具来完成以前在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