-2

現在、タイムスタンプが Tue Oct 01 10:59:59 PDT 2013 として表示されるバッチ -50plus csv ファイルを毎週処理しています。 10:59:59。タイムスタンプが最初の文字列にあるファイルもあれば、3 番目の文字列にあるファイルもあります。運がない…

以下は、2 つの csv ファイルの抜粋です。

1.csv

Tue Oct 01 10:59:59 PDT 2013,data1,1,Databcd,Dataxyz,0,0,431,0

Tue Oct 01 11:59:59 PDT 2013,data1,1,Databcd,Dataxyz,0,0,401,0

2.csv

data1,0,Databcd,0,0,0,Tue Oct 01 11:59:59 PDT 2013,Dataxyz

data1,0,Databcd,0,0,0,Tue Oct 01 12:59:59 PDT 2013,Dataxyz

前もって感謝します -

ここに私が最後に実行したスクリプトがあります..

#!/bin/bash

for f in $*
do
echo "Processing [$f]..."

ftemp=$f.TMP
    #echo "ftemp=$ftemp"
#this uses sed to delete the day(word) frm the timestamp.
sed -e 's/Mon //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original
sed -e 's/Tue //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original 
sed -e 's/Wed //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original
sed -e 's/Thu //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original
sed -e 's/Fri //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original
sed -e 's/Sat //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original
sed -e 's/Sun //g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original

#strip out the PDT & Year from end of each line 
sed -e 's/\ PDT / /g' -e 's/\ PST / /g' <$f >$ftemp
mv $ftemp $f   #copy it back over the original
sed --date="Oct 01 00:59:59 2013" +%D <$f >$ftemp
mv $ftemp $f   #copy it back over the original
#echo "10/01/2013" |    sed -E 's/([a-z ]?)\/([0-9][0-9 ]?)\/([0-9][0-9][0-9][0-9]
#/\3-\2-\1/' <$f >$ftemp
#   tr  'Oct' '10/' <$f >$ftemp
#   mv $ftemp $f   #copy it back over the original
done

echo "Done."

ご覧のとおり、コメントアウトして試したいくつかのオプションがあります

4

3 に答える 3

0

awk が必要な場合があります。

このスクリプトは、各フィールドを調べて、目的の形式の日付に変更しようとします。次に、元の形式に戻して、元の形式と一致することを確認します。オリジナルが作成されたものと一致する場合、そのフィールドを置き換えて印刷します。

TZ が CSV ファイルに設定されているものに設定されていない場合、タイム ゾーンの一致に問題が生じる可能性があります。

#!/bin/awk -f
BEGIN { FS = ","; OFS="," }
{
    # print
    for (i=1; i<=NF; i++)
    {
        cmd = "date -d '" $i "' +'%D %T' 2> /dev/null"
        # print cmd
        if ( ( cmd | getline result ) > 0 )
        {
             # print $i, result
             cmd = "date -d '" result "' +'%a %b %d %T %Z %Y'"
             if ( ( cmd | getline revert ) > 0 )
             {
                 # print $i, result, revert
                 if ( $i == revert )
                 {
                     # print "Changing " $i " to " result
                     $i = result
                 }
             }
             # print $i
             # print ""
        }
    }
    print
}
于 2013-10-09T23:01:27.317 に答える
0

This might work for you (GNU sed):

sed -ri '1{x;s/^/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/;x};G;s/... (...) (..) (..:..:..) PDT ..(..)(.*)\n.*\1(..).*/\6\/\2\/\4 \3\5/;s/\n.*//' file
于 2013-10-10T06:20:56.657 に答える