2

以下に示すように、各行がタイムスタンプで始まる巨大なファイルがあります。2 つの日付の間の行を grep する方法が必要です。各行の日付フィールドを抽出して日/月/年を比較する代わりに、sed または awk を使用してこれを行う簡単な方法はありますか?

たとえば、最初のフィールドのタイムスタンプを確認して、2013 年 6 月 1 日から 2013 年 6 月 15 日までのデータを抽出する必要がある

ファイルの内容:

2013-06-02T19:44:59;(3305,3308,2338,102116);aaaa;xxxx
2013-06-14T20:01:58;(2338);aaaa;xxxx
2013-06-12T20:01:58;(3305,3308,2338);bbbb;xxxx
2013-06-13T20:01:59;(3305,3308,2338,102116);bbbb;xxxx
2013-06-13T20:02:53;(2338);bbbb;xxxx
2013-06-13T20:02:53;(3305,3308,2338);aaaa2;xxxx
2013-06-13T20:02:54;(3305,3308,2338,102116);aaaa2;xxxx
2013-06-14T20:31:58;(2338);aaaa2;xxxx
2013-06-14T20:31:58;(3305,3308,2338);aaaa;xxxx
2013-06-15T20:31:59;(3305,3308,2338,102116);bbbb;xxxx
2013-06-16T20:32:53;(2338);aaaa;xxxx
2013-06-16T20:32:53;(3305,3308,2338);aaaa2;xxxx
2013-06-16T20:32:54;(3305,3308,2338,102116);bbbb;xxxx
4

3 に答える 3

2

最初の選択肢ではなかったかもしれませんが、Perl はこのタスクに最適です。

perl -ne "print if ( m/2013-06-02/ .. m/2013-06-15/ )" myfile.txt

これが機能する方法は、最初のトリガーが一致した場合 (つまり) 、2 番目のトリガーが一致するまで (つまり )、各行でm/2013-06-02/条件 ( ) が実行されるというものです。printm/2013-06-15

ただし、トリガーとして指定した場合m/2013-06-01/、これはファイル内で一致しないため、このトリックは機能しません。

それほど刺激的ではない手法は、各行からテキストを抽出して、次のことをテストすることです。

perl -ne 'if ( m/^([0-9-]+)/ ) { $date = $1; print if ( $date ge "2013-06-01" and $date le "2013-06-15" ) }' myfile.txt

(式と動作の両方をテストしました)。

于 2013-07-04T08:43:59.050 に答える
1

sed2 つのパターン間のすべての線を印刷するために使用できます。この場合、sort日付がインターリーブされるため、最初にファイルを作成する必要があります。

$ sort file | sed -n '/2013-06-12/,/2013-06-15/p'
2013-06-12T20:01:58;(3305,3308,2338);bbbb;xxxx
2013-06-13T20:01:59;(3305,3308,2338,102116);bbbb;xxxx
2013-06-13T20:02:53;(2338);bbbb;xxxx
2013-06-13T20:02:53;(3305,3308,2338);aaaa2;xxxx
2013-06-13T20:02:54;(3305,3308,2338,102116);aaaa2;xxxx
2013-06-14T20:01:58;(2338);aaaa;xxxx
2013-06-14T20:31:58;(2338);aaaa2;xxxx
2013-06-14T20:31:58;(3305,3308,2338);aaaa;xxxx
2013-06-15T20:31:59;(3305,3308,2338,102116);bbbb;xxxx
于 2013-07-04T09:06:37.283 に答える