Linux で 1 行で数字を増やす最良の方法

Linux で 1 行で数字を増やす最良の方法

1 行に多くのエントリがあり、その中には時間も含まれています。

 ('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...

それぞれの時間を数時間ずつ増やしていきたいと思います。24 時間形式です。たとえば、次のよう10:30:00になります15:30:00

この仕事に最適な汎用ツールは何でしょうか? 私は次の点を考えています:

  1. システムユーティリティawksed...、その他はわかりません

  2. vim

  3. bashまたはPythonのようなスクリプト言語

それを実行する標準的な方法は何でしょうか?

答え1

明確にするために:

vimは、ほとんどの *nix システムのシステム ユーティリティ (テキスト エディター) です。awk、、sedは、bashテキストを解析および変更するために使用できる言語 (またはコンテキストに応じてツール) です。

何のために時間を増やす必要があるのか​​、どのくらいの頻度で増やす必要があるのか​​。これらは、使用するツールの要因となります。いずれにせよ、これは SQL ではないと仮定すると、複数の部分から成る作業です。

  1. まず、文字列内の部分的な文字列を照合します。正規表現でawk、、、sedまたはを使用しgrep -eて、それらの部分文字列を取り出すことができます。

  2. これらの値を取得したら、それらを整数に変換します (または、Python などのより完全な言語を使用している場合は、ライブラリを使用してそれらを datetime 値にキャストできる可能性があります)。これらの値を変更するには、必要な計算 (および該当する場合は検証) を行う必要があります。

  3. 最後に、置き換えた値を行に追加し、変更したファイルを保存します。

正直に言うと、これは のように見えるのでsql、 を使用する方がはるかに簡単かもしれません。組み込みツールその言語でそれらの値を変更します。

答え2

良いヒントがいくつかあるこの答え数学演算とマッチング演算を混在させることができる Perl、Python、Ruby などのスクリプト言語を使用して、最も抵抗の少ないパスを提案します。

以下は Perl を使った簡単なハックです:

$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
    's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$

この単純な例では、数字文字クラス ( \d) とそれに続く繰り返しインジケーター (例{2}) を使用して日付の位置コンポーネントを取得し、時間フィールドで盲目的に演算を実行します。このタイプのソリューションは、時間フィールドでの単純な演算によって日が繰り越されないことを保証できるほどデータについて十分理解している場合にのみ適切です。

@Lieven の指示に従って時間フィールドがオーバーフローした場合の正しい日付/時刻演算に対処するためにこの問題を再検討するには、Perl コア モジュールTime::Piece(Perl>5.8) を使用できます。

$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
    perl -MTime::Piece -pe \
        's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
            Time::Piece->strptime($1, "%Y-%m-%d %T") \
            + (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$

このサンプル入力は、次の日に繰り越される時間値の適切な処理を示すように更新されています。Time::Pieceコマンドラインでモジュールを取り込み、入力から日付と時刻を照合し、Time::Piece日付/時刻の演算を実行するためにオブジェクトに変換してから、目的の出力形式に文字列化します。

関連情報