3

sed、regex、windows cmd、またはその両方で、csv ファイルの行を恐ろしい日時実装で再フォーマットして、使用可能なものにする方法がわかりません。

与えられた:

Name,Equip1_SA-TEMP -- ASample,7/8/13   0:00,55.10

Name,Equip1_SA-TEMP -- ASample,7/8/13   0:10,55.50 

たとえば、(7/8/13 0:00) の日時部分を「検索」し、SQL のような DATETIME に再フォーマットする必要があります。

Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:00:00,55.10

Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:10:00,55.50

ご覧のとおり、これには月、日、時間の前に「0」を追加し、次に秒を表す :00 を追加する必要がある場合があります。

日時領域を取得するのは次のようなものです。

sed -E 's#^([^/]+)/([^/]+)/([0-9]+)

、しかし、私は最初に「それに到達する」ことができません...その2番目の「、」を最初に見つける必要がありますか?

常に 1 行に 4 つのフィールドがあります。

Name,SomeEquipmentId,DateTime,Value.

これを取得するためのsed + windowsコマンドの適切な組み合わせはありますか? それとも、これをすべて行うために高レベルのコードを書いたほうがよいのでしょうか?

awk で更新: 次のようないくつかのコマンドを試しました: awk -F 、 "{split($3,a,[:blank:]); vdate=a[1]; tdate=a[2]; print vdate}" ファイル.csv

しかし、[ char で構文エラーが発生します。エスケープしてもうまくいきません。\""%%3s を試しましたが、それでも文字列全体が返されます (例: 7/18/13 00:10)。それらを配列に分割しようとする代わりに、使用するより良い awk 文字列コマンドはありますか?

4

2 に答える 2

2

片道GNU awk

awk '
BEGIN {
  FS=OFS=","
}
{
  split($3,ary,/[\/: ]/)
  $3=mktime(20 ary[3]" "ary[1]" "ary[2]" "ary[6]" "ary[7]" "00)
  $3=strftime("%F %T",$3)
}1' csvfile

テスト:

$ cat csvfile 
Name,Equip1_SA-TEMP -- ASample,7/8/13   0:00,55.10
Name,Equip1_SA-TEMP -- ASample,7/8/13   0:10,55.50 

$ awk '
BEGIN {
  FS=OFS=","
}
{
  split($3,ary,/[\/: ]/)
  $3=mktime(20 ary[3]" "ary[1]" "ary[2]" "ary[6]" "ary[7]" "00)
  $3=strftime("%F %T",$3)
}1' csvfile
Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:00:00,55.10
Name,Equip1_SA-TEMP -- ASample,2013-07-08 00:10:00,55.50 
于 2013-07-13T04:34:48.007 に答える