1

私は 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

助言がありますか

4

8 に答える 8

1
while IFS=: read hour min; do 
    printf "%02d\n" $((10#$min + 1))
done <<END
2:43
2:05
15:00
8:08
0:59
END
44
06
01
09
60

次の時間への分のラップには、gawk のような時間関数を備えた言語を使用します。

awk -F: '{
    time = mktime("1970 01 01 " $1 " " $2 " 00")
    time += 60
    print strftime("%M", time)
}' 
perl -MTime::Piece -MTime::Seconds -nle '
    $t = Time::Piece->strptime($_, "%H:%M");
    print +($t + ONE_MINUTE)->strftime("%M");
'
于 2013-05-24T18:46:24.237 に答える
1

更新#2

あなたのスクリプトにはいくつかの問題があります。最初は代わりにor`cat file`を使用する必要が あります。ファイルを開くだけなので、呼び出しは不要です。一方、内部的に適切な機能を備えているため、 and (and ) の呼び出しも必要ありません。したがって、いくつかの s とs を再び節約できます。`<file`$(<file)forkexecbashcutbcprintfbashforkexec

入力ファイルが大きい場合 (cca 32 KiB を超える場合)、for-loop 行が大きすぎて処理できない可能性があるbashため、代わりに -loop を使用しwhileてファイルを 1 行ずつ読み取ることをお勧めします。

純粋に次のようなことを提案できますbash(Atleのsubstrソリューションを適用):

while IFS=: read hr min; do
  incr_min=$((1$min+1)); #Octal problem solved
  echo ${incr_min: -2}; #Mind the space before -2!
  #or with glennjackman's suggestion to use decimal base
  #incr_min=0$((10#$min+1))
  #echo ${incr_min: -2};
  #or choroba's solution improved to set variable directly
  #printf -v incr_min %02d $((10#$min+1))
  #echo $incr_min
done <file

入力ファイル

$ cat file
2:43
2:05
15:00
12:07
12:08
12:09

出力:

44
06
01
08
09
10

printf -v単一のステップで結果を変数に入れるため、おそらく最も単純です。

tripleee結果が 60 の場合に何が起こるかについての良い質問です。

于 2013-05-24T15:21:17.133 に答える
0

これを試して:

for x in $(<$1); do
    printf "%02d\n" $(((${x#*:}+1)%60));
done
于 2013-09-26T04:17:48.863 に答える
-1

0 でパディングし、最後の 2 文字を取得します。

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
于 2013-05-24T15:02:59.700 に答える