awk
정규식에 대한 도움이나 조언이 필요합니다. 불규칙하게 구조화된 데이터 입력 파일이 있습니다. 이 파일을 올바르게 구문 분석하려면 다음 형식의 줄을 식별해야 합니다.
@ 8/1/17, 10:04 PM
이 패턴이 있는 줄은 전체 트랜잭션의 끝을 표시합니다. 공백과 문자 앞에 날짜와 타임스탬프만 있으면 됩니다 @
.
나는 "대부분의" 사용법과 일치하는 것으로 보이는 정규식을 함께 엮었습니다.
\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M
그러나 다음 문에서 사용하면 일치하지 않는 것 같습니다 awk
.
$ awk 'match($0, /\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M/) {print $0}' testfile2.txt
내 시스템(모하비마코스)에는 이전 버전이 있습니다 awk
awk version 20070501
.
나는 또한 다음을 발견했습니다:
grep -e
testfile2.txt
이 패턴을 의 어떤 행과 도 일치시킬 수 없었지만 일치할 것으로 예상했던 행과 일치했습니다egrep
.grep -E
awk 'match($0, /\@/) {print $0}' testfile2.txt
예상한 줄과 일치(및 인쇄)하지만 단일 문자에 의존할 수는 없습니다!
이것은 testfile2.txt입니다:
+13054261988: 데이터를 기본 저장소로 전달
@ 1/7/18, 오후 4:21
+16744774911: 다음 URL을 사용하세요:https://www.repo-prime.ga/
@1/7/18, 오후 4시 22분
+13054261988: 네. 비밀번호는 괜찮나요?
@ 1/7/18, 6:12 PM
+16744774911: 아니요, 모든 거래에 2FA를 사용합니다
@ 1/7/18, 8:56 PM
+13054261988: Google OTP를 사용하시겠습니까?그렇다면 더 많은 정보가 필요합니다.
@ 1/7/18, 오후 9:36
+13054261988: 최대한 빨리 답장해 주세요. 업로드해야 할 거래가 있습니다.
@ 2018년 1월 7일 오후 9시 46분
awk
명령문에서 볼 수 없는 오류로 인해 정규식이 사용 중 일치하지 않습니까 awk
? 아니면 정규식 자체, 둘의 조합 등으로 인해 발생합니까?
답변1
{…}
아주 오래된 awk 버전에는 해당 기능이 없는 것 같습니다 .
이 이전 정규식 구문은 모든 awk에서 일치해야 합니다.
awk '/@ [0-9][0-9]?\/[0-9][0-9]?\/[0-9][0-9]?, [1-2]?[0-9]:[0-6][0-9] [AP]M/' file
awk가 다음과 같은 대괄호 표현식과 일치할 수 있으면 [[:blank:]]
정규식을 더 유연하게 만들 수 있습니다 .
awk '/@[[:blank:]][0-9][0-9]?\/[0-9][0-9]?\/[0-9][0-9]?,[[:blank:]][1-2]?[0-9]:[0-6][0-9][[:blank:]][AP]M/' file
하나 이상의 숫자를 일치시키는 것으로 충분하다면(왜 안되는지 모르겠습니다) 더 짧은 정규식을 사용할 수 있습니다.
awk '/@ [0-9]+\/[0-9]+\/[0-9]+, [1-2]?[0-9]:[0-6][0-9] [AP]M/' file
필요한 경우 start ^
및 end를 추가하여 $
정규식을 더욱 제한적으로 만들 수 있습니다.
나는 match
이렇게 단순한 줄 일치를 사용하지 않지만 동일한 정규식은 이 함수와 완벽하게 작동합니다.
답변2
- 이전에 왜 엄격한 일치
/\W
(단어가 아닌 문자) 를 사용합니까@
? 텍스트 파일이@
줄의 시작 부분에 있는 것처럼 \@
,\,
, 로 문자를 이스케이프할 필요가 없습니다 .:
(특수 문자가 아닙니다.)match()
패턴만 일치시키면 통화가 중복됩니다.
$ awk '/^@ [0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}, [0-9]{1,2}:[0-9]{2} [AP]M/' file
@ 1/7/18, 4:21 PM
@ 1/7/18, 4:22 PM
@ 1/7/18, 6:12 PM
@ 1/7/18, 8:56 PM
@ 1/7/18, 9:36 PM
@ 1/7/18, 9:46 PM