일부 날짜가 유효하지 않은 두 날짜 사이의 파일 하위 집합

일부 날짜가 유효하지 않은 두 날짜 사이의 파일 하위 집합

나는 몇 가지 유사한 문제에 직면했지만 해결책이 실패한 것 같았습니다. 내 파일에 타임 스탬프로 필터링하려는 시도를 망치는 정크 데이터가 있었기 때문이라고 생각합니다.

다음은 예제 파일입니다:

2020-12-12 12:10:00,3,4,2
2020-12-12 12:11:00,4,3,2
2020-12-12 12:12:00,4,3,2
2020-12-12 12:13:00,4,3,2
20-12-12 12:14:00,4,3,2
4,3,2
2020-12-12 12:16:00,4,3,1
-12-12 12:17:00,4,3,2
2020-12-12 12:18:00,5,3,2

이 파일을 필터링하고 유효한 타임스탬프만 포함된 새 파일을 만들고 싶습니다(각 줄은 유효한 타임스탬프로 시작해야 함).

BegDate="2020-12-12 12:11:00"
EndDate="2020-12-12 12:16:00"

나는 sed를 사용해 보았습니다.

TimeWindow=$(sed -rne '/'$BegDate'/,/'$EndDate'/p' $MyFile)
echo $TimeWindow > NewFile.csv

그리고 어우

awk -v from=$BegTime -v to=$EndTime '$1>=from && $1<=to' "$MyFile" > "NewFile.csv"

하지만 둘 다 실패

"NewFile.csv"의 예상 결과는 다음과 같습니다.

2020-12-12 12:11:00,4,3,2
2020-12-12 12:12:00,4,3,2
2020-12-12 12:13:00,4,3,2
2020-12-12 12:16:00,4,3,1

답변1

awk첫 번째 필드가 유효한 날짜 형식을 따르는지 확인하여 접근 방식을 개선 할 수도 있습니다 .

LC_ALL=C awk -F, -v from="$BegTime" -v to="$EndTime" '
  BEGIN {valid = "^" from "$"; gsub("[0-9]", "[0-9]", valid)}
  $1 ~ valid && $1 >= from && $1 <= to'

날짜 유효성 검사를 위한 위의 정규식은 숫자를 (C 로케일과 동일 ) $BegTime로 바꾸고 시작과 끝에 앵커를 시작과 끝에 앵커에 추가하여 작성됩니다.[0-9][0123456789]^$

유효하지 않은 날짜(예: 9999-99-99 99:99:99 또는 2022-02-29 00:00:00)도 제외하려는 경우 정규식을 최적화할 수 있습니다.

모든 셸 매개변수 확장을 인용해야 합니다. 코드가 다음 예 중 하나와 어떻게 일치하는지 확인하세요.bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험). 또한 귀하의 질문에 BegTime와 사이의 차이점을 적어 두십시오.BegDate

관련 정보