공백으로 구분된 데이터 줄이 포함된 텍스트 파일이 있습니다.
예:
B 345678 2005-12-21 4174 1 62 11111 16543 1911 786543,45
그러나 간격이 약간 일치하지 않으며 때로는 추가된 탭도 있는 것으로 의심됩니다. 모든 줄에 항상 나타나는 숫자인 "62" 앞의 줄을 자르는 방법을 찾아야 합니다. 이 숫자는 항상 모든 줄에 나타나고 때로는 5자리 숫자가 따라오고 그 다음에는 항상 또 다른 5자리 숫자가 옵니다. 또한 불일치 위험을 최소화하기 위해 62 앞에 공백을 추가했습니다.
지금까지 나는 이것을 생각해 냈습니다.
grep " 62 [1-9][0-9][0-9][0-9][0-9] " file
이렇게 하면 가끔 5자리 숫자가 나타나는 줄만 제공됩니다. 62를 grep하고 그 뒤에 선택적으로 5자리 숫자, 그 다음에는 필수 5자리 숫자를 입력하는 방법이 필요합니다.
이것이 가능합니까?
/폴
답변1
62를 grep하고 그 뒤에 선택적으로 5자리 숫자, 그 다음에는 필수 5자리 숫자를 입력하는 방법이 필요합니다.
이는 그 뒤에 1~2개의 5자리 숫자가 있다고 말하는 것과 같으며 62
, 첫 번째 숫자만 일치시키면 충분합니다. 다양한 수의 공백을 처리하는 것은 쉽습니다. 을 사용 ␣+
하거나 [[:space:]]+
탭을 포함할 수 있습니다.
그래서,
grep -E ' 62 +[1-9][0-9]{4} '
또는
grep -E '[[:space:]]62[[:space:]]+[1-9][0-9]{4}[[:space:]]'
물론 전체 줄이 인쇄됩니다. 62부터 시작하는 부분만 필요한 경우 .*
줄 끝 부분과 일치하도록 추가하고 -o
일치하는 부분만 인쇄합니다.
grep -o -E '[[:space:]]62[[:space:]]+[1-9][0-9]{4}[[:space:]].*'
답변2
awk
이 목적으로 사용할 수 있습니다 :
awk '{if (match($0, "(^[[:print:]]*[[:space:]]+)?(62([[:space:]]+[1-9][0-9]{4})?([[:space:]]+[[:print:]]*)?[[:space:]]+[1-9][0-9]{4}([[:space:]]*|[[:space:]]+[[:print:]]*)$)", a)!=0) print a[2];}' file.txt
62
이것은 시작 부분이나 앞에 인쇄 가능한 문자 수, 하나 이상의 공백 문자, 다음 중 고아가 있는 모든 행과 일치합니다.
- 선택적 공백 및 5자리 숫자
- 선택적으로 인쇄 가능한 문자 수
- 강제 공백 및 5자리 숫자
- 선택적으로 하나 이상의 공백과 인쇄 가능한 문자 수 또는 후행 공백
이러한 패턴이 발견되면 해당 줄의 처음 62
부터 끝까지 인쇄됩니다.
이는 구분 공백을 압축하지 않으므로 "일관되지 않은 공백"이 있는 그대로 출력에 복사됩니다.
답변3
...62 이전의 모든 항목을 삭제합니다(.....)
perl -pe 's/.*?(?= 62 +[1-9]\d{4} )//'
어디:
s/.*?...//
- 모든 것을 제거한다는 의미 = 아무것도 교체하지 않음.*?(?= 62)
- 62 이전의 콘텐츠를 의미합니다...
답변4
나는 추천한다
grep -E '\b62([[:blank:]]+[[:digit:]]{5}\b){1,2}'
\b
줄의 시작 부분이나 단어가 아닌 문자(예: 공백) 뒤에 "62"가 나타날 수 있도록 하는 단어 경계는 어디에 있습니까?