2020年1月1日から2021年4月4日までの日付を含むファイルがあります。 egrepを使用して、2020年1月3日から2021年1月3日までの日付のみをインポートしたいと思います。 ~しようとする
egrep "([0][1-9]|[1-2][0-9]|[3][0]/[0][3-9]|[1][0-2]/[2][0][2][0-1])$" dates.txt
しかし、まだファイルのすべての日付が表示されます。
$ cat dates.txt
01/01/2020
24/01/2020
04/02/2020
23/02/2020
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
25/03/2021
04/04/2021
答え1
日付が順番にあり、開始日と終了日の両方のファイルにある提供されたサンプルファイルを使用すると、よりawk
簡単な解決策を見つけることができます。
$ awk '$1=="01/03/2020",$1=="01/03/2021"' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
$
参考としてご利用の際はegrep
参考にしてください廃止、POSIX互換grep -E
方式をサポートしています。
答え2
私は正規表現だけを使ってこれをやろうとはしません。より洗練されたツールを使用すると、作業が簡単になります。たとえば、次のようにしますawk
。
$ awk -F/ '($3==2020 && $2 > 2) || ($3==2021 && ($2 < 3) || ($1< 2 && $2 == 3))' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
awk
フィールド区切り文字を設定/
し、次の3つの基準のいずれかに一致する行を選択します。
- 最後のフィールド(年)はで
2020
、2番目のフィールド(月)はより大きいです2
。これは01/03/2020
からのすべての日付と一致します31/12/2020
。 - 最後のフィールド(年)は
2021
、- 2番目のフィールド(月)が
3
ORより小さいです。 - 最初のフィールド(日)は小さく、
2
2番目のフィールド(月)は正確です3
。
- 2番目のフィールド(月)が
答え3
説明によると、2020年以降の日付が必要です01/03/2020
。それは次のとおりです。
$ egrep "(../(0[3-9]|1[0-2])/2020$)" dates.txt
また、2021年から現在までのすべての日付も使用できます01/03/2021
。その部分は次のとおりです。
$ egrep "((/0[1-2]/|01/03/)2021$)" dates.txt
2つの範囲を組み合わせます。
$ egrep "(../(0[3-9]|1[0-2])/2020$|(/0[1-2]/|01/03/)2021$)" dates.txt
少し単純化するとgrep -E
(現在のegrepと同じ)に変更し、出力を一覧表示します。
$ grep -E "(/(0[3-9]|1[0-2])/2020|(/0[1-2]/|01/03/)2021)$" dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
あなたのソースファイルは次のとおりです。
$ cat dates.txt
01/01/2020
24/01/2020
04/02/2020
23/02/2020
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
25/03/2021
04/04/2021
答え4
ただawkを使用してください:
$ awk -F'/' '{d=$3$2$1} (20200301 <= d) && (d <= 20210301)' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
上記は、入力がソートされているかどうか、入力に範囲で区切られた日付があるかどうかに関係なく機能します。
「分離した日付を除外する場合」<=
に変更してください。<
between