Linux의 열 비교

Linux의 열 비교

File1의 열 3을 File2의 열 2와 비교하고 싶습니다. File1의 열 3에 있는 값이 File2의 열 2에 나타나지 않으면 File1의 전체 행을 인쇄합니다.

파일 1:

5/3/2021        Mobile   $2,627.59
5/3/2021        Phone    $2,056.11
5/3/2021        Loan     $5,146.11

파일 2:

5/11/2021   $2,627.59 
5/12/2021   $2,056.11
5/15/2021   $7,516.11
5/13/2021   $406.11
5/12/2021   $2,056.11

원하는 출력:

5/3/2021        Loan     $5,146.11

답변1

awk '
  NR==FNR{ values[$2]; next }
  !($3 in values)
' File2 File1

먼저 File2배열의 두 번째 필드를 읽고 이를 values인덱스로 저장합니다. 이 테스트는 NR==FNR비어 있지 않은 첫 번째 입력 파일에서만 작동합니다. 스크립트는 next다음 코드 줄을 건너뛰고 계속 기록합니다.

그런 다음 File1세 번째 필드가 배열의 인덱스로 나타나지 않는지 읽고 확인하십시오 values. true인 경우 현재 레코드를 인쇄합니다(기본 동작).

답변2

프로세스 대체와 함께 쉘 사용(쉘이 그렇지 않은 경우 먼저 파일을 개별적으로 정렬하십시오 <(...)):

join -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
    <( sort -b -k 3,3 File1 ) \
    <( sort -b -k 2,2 File2 )

첫 번째 데이터세트의 세 번째 열( -1 3)과 다른 데이터세트의 두 번째 열( )을 조인 필드로 사용하여 -2 2정렬된 두 데이터세트 간에 관계형 JOIN 작업을 수행합니다 . 지정된 옵션에 따라 join첫 번째 파일의 첫 번째, 두 번째, 세 번째 열이 출력됩니다 -o. 두 번째 파일( )의 어떤 라인에도 연결할 수 없는 첫 번째 파일의 라인만 출력합니다 -v 1.

joinsort -b입력은 조인 필드로 사용될 열을 사용하여 정렬되어야 하며 , 이는 두 프로세스 대체가 수행하는 작업입니다.

주어진 데이터를 사용한 출력은 다음과 같습니다.

5/3/2021 Loan $5,146.11

파일이 탭을 필드 구분 기호로 사용하는 경우 다음을 사용할 수 있습니다.

join -t $'\t' -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
    <( sort -t $'\t' -b -k 3,3 File1 ) \
    <( sort -t $'\t' -b -k 2,2 File2 )

관련 정보