awkコマンドの日付形式の変更

awkコマンドの日付形式の変更

次のサンプルレコードを含むmdn.txtファイルがあります。

mdn.txt:

123456,2711448,1,20150214092425,20150714092425,120,20150814163821,,123,,,123,20150214092425,,123,,,123,20150214092425,,123,Y

ここで、ファイル内の各レコードを処理し、awk日付フィールドの形式を次のように変更しようとしています。

123456,2711448,1,14-02-2015 09:24:25,14-07-2015 09:24:25,120,14-08-2015 16:38:21,,123,,,123,14-02-2015 09:24:25,,123,,,123,14-02-2015 09:24:25,,123,Y

ここに入力した日付は(はい耳、中サイズ昼間、Dこんな、時間私たちの、中サイズ早い、S第二)

YYYYMMDDHHMMSS

出力は次のようになります。

DD-MM-YYYY HH:MM:SS

ベストアンサー1

awk 'BEGIN{ FS=OFS="," 
            n=split("4,5,7,13,19", f)   # array of input field numbers
     }
     { for(i=1; i<=n; i++) if($f[i]) $f[i] = dconv($f[i]); print 
     }
     function dconv(x) {
       YY=substr(x, 1, 4)
       mm=substr(x, 5, 2)
       dd=substr(x, 7, 2)
       hh=substr(x, 9, 2)
       nn=substr(x,11, 2)
       ss=substr(x,13, 2)
       return dd"-"mm"-"YY" "hh":"nn":"ss  
     }' file

以下は、配列がもう1つあり、関数がない(基本的に)同じスクリプトです。

awk 'BEGIN{ FS=OFS=","
            nf=split("4,5,7,13,19", f)                           # array of input field numbers
            nd=split(",7,2,-,5,2,-,1,4, ,9,2,:,11,2,:,13,2", d)  # array of date subfield info (in output order): prefix(out),pos(in),len(in)         
     }
     { for(i=1; i<=nf; i++){ 
           if($f[i]) {
               fmod=""
               for(j=1; j<=nd; j+=3) fmod=fmod sprintf("%s", d[j] substr($f[i], d[j+1], d[j+2]))
               $f[i] = fmod
           }
       } print
     }' file

おすすめ記事