web-dev-qa-db-ja.com

awkを使用して日付のタイムスタンプを12時間から24時間に変換する

次の構造のデータを含む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

したがって、上記では、私は次のプロセスを実行する必要があると考えています(おそらくより効率的な方法があります)。

  1. 日時を一時的に独自のレコードに分離する

    "12345"、 "BLAH"、 "DEDA"、 "0.000"、 "1.111"、 "2.22222"、 "3.3333333、" 15/12/2017 "、" 4:26:00 PM "

  2. 時間レコードをターゲットにして、希望の24時間形式に変換します
  3. 日付と時刻のレコードを1つのレコードに連結します

私はawkを使用してこれを達成しようとしていますが、最初のセクションで立ち往生しています!この仕事に適したツールであるか、別のツールをお勧めしますか?

ステップ1から始めます。日付のターゲットを設定することもできません。

awk 'BEGIN {FS=","} { gsub(/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/, "TESTING"); print }' myfile.csv
4
GustavMahler

ここでは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(12PMを除く)の場合、時間の部分に12を追加し、12AMを0に変更します。

awkを使用すると、Word境界部分を実行せず(したがって、たとえば123:21:99 AMERICAで誤検知が発生する可能性があります)、1行に1つしか発生しないと想定します。

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}'
5

このソリューションは、各行で12時間形式のすべてのアイテムを24時間形式に変換します。

gawk -F, '
{
    for(i = 1; i <= NF; i++) {
        if($i ~ /:[0-9]{2} [PA]M/) {
            split($i, arr, ":| ")

            if(arr[5] ~ /P/)
                arr[2] += 12 

            $i = sprintf("%s %02d:%02d:%02d\"", arr[1], arr[2], arr[3], arr[4])
        }
    }
    print
}' OFS=, input.txt

入力

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","15/12/2017 4:26:00 PM"
"22345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","16/12/2017 6:26:00 AM"
"32345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","17/12/2017 10:00:00 PM"
"42345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","18/12/2017 11:26:00 AM"
"52345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","19/12/2017 2:26:00 PM"

出力

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","15/12/2017 16:26:00"
"22345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","16/12/2017 06:26:00"
"32345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","17/12/2017 22:00:00"
"42345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","18/12/2017 11:26:00"
"52345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","19/12/2017 14:26:00"
0
MiniMax