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