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를 확인한 다음 탭이나 개행 문자 앞에 있는 문자가 있으면 자동 분할 배열의 첫 번째 필드와 발견된 필드를 인쇄합니다.