次の形式でデータを出力するプログラムがあります。
date, time,field1,field2,field3,fieldn
12/20/14,08:01:53,318.622,0.93712,21.6867,1.1089
ファイルには多くの列があり、すべて同じままにする必要があります。
日付形式は米国ですが、米国ではない国が必要です。
date, time,field1,field2,field3,fieldn,....
20/12/14,08:01:53,318.622,0.93712,21.6867,1.1089,....
これを達成する最も簡単な方法は何ですか?探してみると、いくつかの例がありますが、まさに私の場合ではありません。また、dateコマンドであるawkとsedを調べましたが、コマンドを生成するのに十分な知識がありません。例えばこの回答awkを使用すると大丈夫に見えますが、私のファイルには何の効果もありません。
私はMacを使っているので、OSXが提供するバージョンに合った命令が必要です。
答え1
sed -E 's,^([0-9]+)/([0-9]+),\2/\1,'
説明する
sed -E
:拡張正規表現でsedを使用すると、エスケープなど()
をする必要はありません。s/foo/bar/
sed
foo
:で検索して置換する一般的な構文ですbar
。ここでは式にsがある,
ので代わりに使用しています。これは単純化されます(エスケープ混乱を避けるためにもう一度申し上げます。したがって。/
/
s,foo,bar,
^([0-9]+)/([0-9]+)
^
:1つ以上の数字が続く行の先頭を検索して[0-9]+
キャプチャグループに入れます()
。今月です。以下は、/
別のキャプチャグループ内の1つ以上の数字(日付など)です。\2/\1
/
:2番目のキャプチャグループ(日)、次に最初のキャプチャグループ(月)に置き換えます。
使用法
ファイルをこのコマンド(例:)にパイプする<your_command_here>| sed…
か、ファイルから直接実行できます(例:)sed… file.txt
。これによりコマンドラインに直接出力されます。新しいファイルに書き込むには、> output.txt
コマンドに追加します。
答え2
日付形式を再指定するときは、標準(ISO)形式(YYYY-mm-dd)を使用することをお勧めします。
perl -MTime::Piece -F, -lane '
if ($.>1) {$F[0] = Time::Piece->strptime($F[0], "%m/%d/%y")->strftime("%F")}
print join ",", @F
'
また、現地以外の日時を考えると、このタイムスタンプはどのタイムゾーンに属していますか?世界時ですか?