.csv
最初の列形式の日付と時刻を含むファイルがあります。01/20/2016 23:53:01
私の列はセミコロンで区切られています。
01/21/2016 03:03:01;18616;0;1
01/21/2016 03:13:01;29040;36553;2
…
存在するだからbashコマンドが見つかりました
date -d '06/12/2012 07:21:22' +"%s"
これは私が望むものに動作します。awk
最初の列を交換するために今統合を試みました。私が一つ見つけた同様の質問に答えてください:
awk -F'"' -v OFS='"' '$8 {cmd="date -d \""$8"\" +%FT%T%z"; cmd | getline $8; close(cmd)} 1' input.json
私はそれを自分の入力に適用しようとします。しかし、私が得た結果は空です。
答え1
質問を書きながらついに問題を解決しました。これが私の解決策です。
awk -F';' -v OFS=';' '$1 {cmd="date -d \""$1"\" +%s"; cmd | getline $1; close(cmd)} 1' datetime.csv > unix.csv
二つが結合されたものでした。点灯を見逃して"
、+%s"
入力内容に線が切れました。
答え2
GNU日付には、-f
ファイルから読み取った日付を1行ずつ変換するオプションがあります。ファイルが非常に長い場合は、date
1行に1回呼び出すよりも高速です。日付はスタンドアロンである必要があるため、最初の列(cut -d \; -f 1
)を分離して実行してdate -f -
変換を実行することを計画しています。生地残りの列の結果です。
paste -d \; <(<input cut -d \; -f 1 | date -f - +%s) <(<input cut -d \; -f 2-)
これはシェルがサポートしていると仮定します。プロセスの交換(ksh93、bash、zsh)。 plainの場合、sh
サポートされている(最もサポートされている)Unixバリアントで/dev/fd
ファイルディスクリプタを混在させることができます。
<input cut -d \; -f 2- | {
exec 3<&0
<input cut -d \; -f 1 | date -f - +%s | paste -d \; - /dev/fd/3
}
答え3
ええと。まあ、私はかなり長い間前のことですが、提案をしたいと思いました。
行が多い場合は、シェルに行き、ファイルの各行に対して「date」を呼び出すのが少し遅くなる可能性があると確信しています。
Google カレンダーからインポートされたタイムシート項目を処理し、一部の HTML を出力して PDF 請求書に変換するスクリプトを作成する予定です。ところがその話をするには長すぎますね。だから私は読書時間を節約するためのコードを提供しています。
私はAWK関数gensubとmktime [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html]を使用しています。 mktime関数には、「YYYY MM DD HH MM SS [DST]」日付仕様書式の入力が必要なため、入力をgensub関数のある場所に移動する必要があります。これが私があなたのために持っているものです...
awk -F';' -v OFS=';' '{ $1=mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)); } 1' datetime.csv > unix.csv
私は少し異なる作業をし、最初のパラメータを書き換えるのではなく、個々のパラメータを印刷します。もっと自己文書化;) チームトウィディ
awk -F';' -v OFS=';' '{ print mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)), $2, $3, $4; }' datetime.csv > unix.csv
スクリプトが少し冗長であることを知っていますが、パフォーマンスが良くなれば幸いです。
これがあなたや他の人が同じことを見るのに役立つことを願っています。