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
필드 구분 기호를 설정 /
하고 다음 세 가지 기준 중 하나와 일치하는 행을 선택하면 됩니다.
- 마지막 필드(연도)는 이고
2020
, 두 번째 필드(월)는 보다 큽니다2
. 이는01/03/2020
에서 까지의 모든 날짜 와 일치합니다31/12/2020
. - 마지막 필드(연도)는
2021
및- 두 번째 필드(월)가
3
OR 보다 작습니다. - 첫 번째 필드(일)는 보다 작고
2
두 번째 필드(월)는 정확히 입니다3
.
- 두 번째 필드(월)가
답변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
두 범위를 결합합니다.
$ 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