19249


**input_date.csv**

[code]

    20151123181100,20151123181101
    20151123181102,20151123181103
    20151123181104,20151123181105
    
[/code]

上記のようなCSVファイルに記載されている日付文字列が`YYMMDDHHMMSS`形式の日付になっているかどうかを、カンマ区切りごとに調べるシェルスクリプトを作成したいと思っています。

ネット等を参照し、いくつか作ってみましたがうまくいかずハマっております。  
自作したシェルスクリプトを下記に記載しております。別のアプローチの仕方等も含めて、お力添えよろしくお願いいたします。

↓自作没シェルスクリプト

[code]

    #!/bin/sh
    date_file=~/input_date.csv
    
    ##試しに1列目だけの日付文字列を取り出して比較してみる。
    while read line; do
        colm1=`echo ${line} | cut -d "," -f 1`
        echo "${colm1}" 　##echoしてみると、ここまでは意図通り動いてくれてるようです。
            if [ "`date +%Y%m%d%H%M%S -d ${colm1}`" == ${colm1} ]; then
                echo "${colm1} is ok"
            else
                echo "正しい日付形式ではありません。"
                exit 1
            fi
    done < ${date_file}    
    
[/code]

実行結果としては、正しい日付形式（真）で比較していてもelseの処理に移ってしまいます。  
colm1で渡している文字列が、`date
+%Y%m%d%H%M%S`のフォーマットにうまく変換されていなさそうですが、そこでもはまっているため、もっとシンプルなやり方がないかと模索しています。  
→別質問版で`[date +%Y%m%d%H%M%S -d 日付]`の件で質問版を立てていましたが、この件の解決に至らずです・・・。


CC BY-SA 3.0
2015-11-23T09:34:42.317
19201
2015-11-24T11:44:35.727
2015-11-23T10:31:23.147
13307
question
linux shellscript
Linux　CSVファイルに格納されている日付がYYMMDDHHMMSS形式であることを判定する


元の文字列と比較している意図がわかりませんが、それが不要であれば、ifの条件部分に過去質問でのargusさんの回答がほぼそのまま入ります。

[code]

    if date -d "$(echo $colm1 | sed -r 's/(.{8})(.{2})(.{2})(.{2})/\1 \2:\3:\4/')" >/dev/null 2>&1; then
    
[/code]


CC BY-SA 3.0
2015-11-23T12:11:55.433
19209
2015-11-23T12:30:56.390
2015-11-23T12:30:56.390
4010
4010
19201
answer


dateを使うのであれば、@emasaka さんの言うとおり食える形に整形するのが一番じゃないかと:

[code]

    #!/bin/sh
    date_file=~/input_date.csv
    
    ##試しに1列目だけの日付文字列を取り出して比較してみる。
    while read line; do
        colm1=`echo ${line} | cut -d "," -f 1`
        d=`echo ${colm1} | sed -E 's/(.{8})(..)(..)(..)/\1 \2:\3:\4/'`
        if ( date -d "$d" >/dev/null 2>&1 ); then
            echo "${colm1} is ok"
        else
            echo "正しい日付形式ではありません。"
            exit 1
        fi
    done < ${date_file}   
    
[/code]

ここまでするぐらいならperl使った方が早いかも

[code]

    $ <~/input_date.csv perl -MTime::Piece -F, -nalE 'localtime->strptime($_, "%Y%m%d%H%M%S") && say "$_ is ok" for @F'
    
[/code]


CC BY-SA 3.0
2015-11-24T11:44:35.727
19249
2015-11-24T11:44:35.727
62
19201
answer