인덱스 파일에서 정확히 일치하지 않는 일치 항목을 찾고 마지막 필드를 인쇄합니다.

인덱스 파일에서 정확히 일치하지 않는 일치 항목을 찾고 마지막 필드를 인쇄합니다.

다음과 같은 2개의 열이 있는 큰 파일(~6백만 줄)이 있습니다.

1111.aaaaabbb.b.cccc.c  ValueA
2222.dddddeee.e.ffff.f  ValueB
3333.gggghhhh.h.iiii.i  ValueC

이 단일 열 파일을 검색할 때 이것을 색인으로 사용하고 싶습니다.

aaaaabbb.b  
dddddeee.e  
gggghhhh.h  

그리고 다음을 반환합니다:

ValueA
ValueB
ValueC
[...]
Valuen

보시다시피, 두 번째 파일의 내용이 첫 번째 파일의 내용과 정확하게 (정확하지는 않지만) 일치하는 한 첫 번째 기간 이후의 값에만 관심이 있으며 첫 번째 파일의 두 번째 값을 반환하고 싶습니다. 열 값 파일. 파일 2의 내용이 정확히 일치하는 한 첫 번째 파일 내용의 접두사/접미사는 신경 쓰지 않습니다.

이를 수행할 수 있는 방법 awk이나 도구가 있습니까 ? bash현재 Excel(Data to Column Tool)에서 데이터 형식을 올바르게 지정하려고 하는데 600만 개가 넘는 행이 있어서 수동으로 6개의 파일을 실행한 다음 결과를 함께 컴파일해야 하기 때문에 시간이 오래 걸립니다.

편집하다내용 file1: 접두사는 항상 숫자이지만, 길이는 4자리에서 7자리까지 다양합니다. 첫 번째 마침표 뒤의 내용은 영숫자이며 길이는 4~15자이며 숫자나 문자로 시작할 수 있고 접미사도 숫자/문자일 수 있습니다.

답변1

인덱스가 있는 파일은 너무 크지 않고 메모리에 완전히 로드될 수 있다고 가정합니다. 그렇다면 다음을 사용할 수 있습니다 awk.

awk -F"[. ]" 'FNR==NR{a[$0]=1} FNR!=NR&&a[$2"."$3]{print $NF}' index_file huge_file

  • awkindex_file검색할 내용과 huge_file질문의 여러 줄이 포함된 두 개의 파일로 호출됩니다 .
  • -F"[. ]"awks 구분 기호를 공백과 점으로 설정합니다.
  • FNR==NR다음에만 적용됩니다.index_file
    • a[$0]=1배열은 검색 패턴을 인덱스로 사용하여 배열을 채우고 a값을 로 설정하여 구성됩니다.1
  • FNR!=NR에만 적용됩니다 huge_file.
  • a[$2"."$3]점으로 연결된 field2와 field3의 배열 인덱스가 존재하는 경우(패턴을 찾은 경우)...
    • print $NF파일의 마지막 필드를 인쇄합니다.

산출:

ValueA
ValueB
ValueC

관련 정보