일정한 레코드 형식이 없는 파일의 필드 필터링

일정한 레코드 형식이 없는 파일의 필드 필터링

3개의 파일이 있고 각 파일에는 수백만 개의 레코드가 있습니다. 일부 데이터를 더 쉽게 찾기 위해 이러한 파일을 필터링하고 싶습니다. 불행하게도 한 레코드에서 다른 레코드로 이어지는 보편적인 형식은 없습니다. 예를 들어:

record1 will contain: A B C D E
record2 will contain A B D E
record3 will contain B C D

내가 가지고 있는 유일한 공통 부분은 일부 식별자를 포함하는 처음 23자입니다(이 중 마지막 15자만 레코드 간에 고유합니다).

식별자와 D 부분을 포함하도록 이러한 파일을 필터링하고 싶습니다. 어떻게 해야 하나요? 필드 사이의 구분 기호는 탭이고 각 부분 안에 쉼표가 있다는 것을 알고 있습니다.

파트 D의 예:

ROAMENT,INT,15
ROAMENT - constant part which identifies the field
INT - some value which is a must if ROAMENT exists
15 - some other value which is optional

답변1

perl -ane 'if (/\t(ROAMENT[^\t\n]*)/) { print $F[0], $1, "\n"; }' inputfile

설명하다:

  • -a자동 분할을 호출하여 입력 필드를 @F ​​배열로 분할합니다. 공백이 있으면 필드가 분할됩니다. 탭만 원하는 경우 추가할 수 있습니다.-F"\t"
  • -n끝에 입력 줄을 인쇄하는 대신 입력 데이터에 대해 자동 루프를 호출합니다.
  • -e각 루프에서 실행할 표현식 정의
  • 이 표현식은 <tab>ROAMENT를 확인한 다음 탭이나 개행 문자 앞에 있는 문자가 있으면 자동 분할 배열의 첫 번째 필드와 발견된 필드를 인쇄합니다.

관련 정보