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
.
join
sort -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 )