次の構造のデータを含むcsvファイルで作業しています。
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 4:26:00 PM"
12時間を24時間に変換したいです。以下は、私が最終的に達成したいことを示しています。
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 16:26:00"
期間変換の問題を解決すると思われる次の質問に対する答えが見つかりました。 https://stackoverflow.com/questions/8083973/bash-and-awk-converting-a-field-from-12-hour-to-24-hour-clock-time#8084087
したがって、上記のように次のようなプロセスを経なければならないと思います(より効率的な方法があるかもしれません)。
日付と時刻を一時的に分離して自己記録として保存
「12345」、「BLAH」、「DEDA」、「0.000」、「1.111」、「2.22222」、「3.3333333、「2017/15/12」、「午後4:26:00」
- 時間記録を対象にして、私が望む24時間形式に変換
- 日付と時刻のレコードを単一のレコードに再結合
これを達成するためにawkを使用しようとしましたが、最初の部分でブロックされました! awkは仕事に適したツールですか?または他のツールをお勧めしますか?
ステップ1から始めます。日付さえ正確に決めなかった!
awk 'BEGIN {FS=","} { gsub(/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/, "TESTING"); print }' myfile.csv
ベストアンサー1
ここでは以下を使用しますperl
。
perl -pe 's{\b(\d{1,2})(:\d\d:\d\d) ([AP])M\b}{
$1 + 12 * (($3 eq "P") - ($1 == 12)) . $2}ge'
つまり、PM(昼12時を除く)の場合は、時間部分に12を追加して12AMを0に変更します。
の場合、awk
単語の境界部分が実行されず(したがって偽の肯定が発生する可能性があります123:21:99 AMERICA
)、各行が一度だけ発生すると仮定します。
awk '
match($0, /[0-9]{1,2}:[0-9]{2}:[0-9]{2} [AP]M/) {
split(substr($0, RSTART, RLENGTH), parts, /[: ]/)
if (parts[4] == "PM" && parts[1] != 12) parts[1] += 12
if (parts[4] == "AM" && parts[1] == 12) parts[1] = 0
$0 = substr($0, 1, RSTART - 1) \
parts[1] ":" parts[2] ":" parts[3] \
substr($0, RSTART + RLENGTH)
}
{print}'