한 파일의 두 열을 다른 파일의 세 열과 일치시키고 두 열이 포함된 파일의 줄을 인쇄합니다.

한 파일의 두 열을 다른 파일의 세 열과 일치시키고 두 열이 포함된 파일의 줄을 인쇄합니다.

내 파일 A에는 아래와 같이 두 개의 열이 있습니다.

7000000185249100 162280
7000000185249048 235500
7000000185249052 755361
7000000185249068 427550
7000000185249070 269102
7000000185249081 291122

내 파일 B에는 다음과 같은 세 개의 열이 포함되어 있습니다.

7000000185249100 1622651 1623044
7000000185249048 235104 235805
7000000185249146 2500324 2502635
7000000185249100 1218818 1221734
7000000185249468 88587 89699
7000000185249239 299691 300277
7000000185249315 769635 769986
7000000185249374 1548986 1549747

그래서 제가 하고 싶은 것은 파일 A의 줄을 인쇄하는 것입니다.

  1. 파일 A의 첫 번째 열에 있는 숫자가 파일 B의 첫 번째 열에 있는 숫자와 일치하고
  2. 파일 A의 두 번째 열에 있는 숫자는 파일 B의 두 번째와 세 번째 열에 있는 숫자의 범위 내에 있습니다.

예상되는 출력은 다음과 같습니다:

7000000185249048 235500

다음 코드를 사용해 보았지만 실패했습니다.

awk -F '\t' 'FNR==NR{a[$1,$2,$3]=$0;next}{if(b=a[$1, >=$2 && <= $3]){print b}}' file B file A

답변1

  1. join공통점을 찾는 데 사용됨처음bash필드는 값을 비교 하는 데 사용됩니다 .

    join --nocheck-order -j 1 A B | 
    while read a b c d ; do 
        [[ ( b -le d && b -ge c ) || ( b -le c && b -ge d ) ]] && echo $a $b
    done 
    

    이것OP명세서"파일 A의 두 번째 열에 있는 숫자는 파일 B의 두 번째와 세 번째 열에 있는 숫자의 범위 내에 있습니다.[[ ". 범위는 정렬되지 않을 수 있으므로 및 사이의 논리가 ]]이를 어느 쪽이든 처리합니다. 예:

    • 만약에A2=3,B2=2, 그리고B3=4, 일치합니다 ( b -le d && b -ge c ).
    • 만약에A2=3,B2=4, 그리고B3=2, 일치합니다 ( b -le c && b -ge d ).
  2. 너무 좋지 않아암소 비슷한 일종의 영양 sed파일의 각 줄에 대한 코드를 변환합니다.두번째두 개의 파이프로 나누어져 있다numgrep파일 검색 명령범위의 경우 e평가주문하다. 명령의 결과 목록에 중복된 출력이 있을 수 있으므로 다음으로 파이프하십시오.awk정렬되지 않은 상태로 실행고유한:

        sed -n \
        's#\(\w*\)\W*\(\w*\)\W*\(\w*\)#numgrep /\1/ A\|numgrep /\2..\3,\3..\2/#e
         /./p' B |
        awk '!a[$0]++'
    

두 방법 중 하나의 출력:

7000000185249048 235500

관련 정보