date -dを使用せずにcsvファイルの日付と時刻の形式を変更する

date -dを使用せずにcsvファイルの日付と時刻の形式を変更する

.csvファイルに次のものが含まれています

Data1|Data2|10/24/2017 8:10:00 AM

3列の日付と時刻の形式を次のように変更したいと思います。

10/24/2017 8:10:00 AM(12時間)から(20171024 08:10:0024時間)まで。

-dを使用しないでください

ベストアンサー1

純粋なawkソリューション(パッキングコマンドなしdate):

awk -F'|' -vOFS='|' '
function fail() {
        printf "Bad data at line %d: ", NR
        print
        next
    }
    {
        if (split($3, date_time, " ") != 3) fail()
        if (split(date_time[1], date, "/") != 3) fail()
        if (split(date_time[2], time, ":") != 3) fail()
        if (time[1] == 12) time[1] = 0
        if (date_time[3] == "PM") time[1] += 12
        $3 = sprintf("%.4d%.2d%.2d %.2d:%.2d:%.2d", date[3], date[1], date[2], time[1], time[2], time[3])
        print
    }'
  • -F'|'入力ラインを縦線$1、、$2など$3で割ります。
  • split($3, date_time, " ")日付/時刻フィールドを日付、時刻、AM/PM インジケータの 3 つの部分に分割します。 3つのブロックがない場合は、エラーメッセージが表示され、対応する行をスキップします。
  • split(date_time[1], date, "/")日付を月、日、年で割ります。
  • split(date_time[2], time, ":")時間を時、分、秒で割ります。
  • たとえば、24時間基準で午前12時42分は00:42です。もちろんPMは12時間を追加します。
  • sprintf年、月、日、時、分、秒を再グループ化し、必要に応じて前にゼロを追加します。$3形式が変更された日付/時刻を使用して入力行を再構成するには、それを割り当ててから印刷します。
  • 機能:たとえば、入力フィールドが3つ以上の場合

    Data1|Data2|10/24/2017 8:10:00 AM|Data4|Data5
    

    スクリプトはこれらの追加フィールドを保持します。


使用法:  いくつかの小さな変更:

  • 上記の複数行コマンドを入力し、}'最後の行の末尾(後ろ)に処理するファイル名を入力します。もちろん、*.csvファイル名に加えて、またはファイル名の代わりにワイルドカード(たとえば)を使用することもできます。
  • 上記と同じですが、その後は次のように}'言います。<そしてファイル名。 (これにより、一度に1つのファイルしか処理できません。)
  • スクリプトファイルを作成します。 
    • 最初の行はでなければなりません#!/bin/sh。 (または必要に応じて、または#!/bin/bash を使用できます#!/usr/bin/env bash。これらのさまざまな "she-bang"行と相対的な利点と対応する記号の違いについての議論はこの質問の範囲外です。検索すると、このトピックに関する多くの議論を見つけることができます。 .)
    • 次に、2行目から上記のコードを入力してください。
    • 最後の行の終わり(すぐ後ろ}')に  "$@" (含む引用符)。
    • 文書を保存します。私たちはあなたがこのスクリプトを呼び出すと仮定しますgman
    • タイプchmod +x gman
    • タイプ./gmanの後にファイル名および/またはワイルドカードのリストを入力するか、<そしてファイル名。

おすすめ記事