다른 파일과 공통 열을 기반으로 탭으로 구분된 파일에서 줄 제거

다른 파일과 공통 열을 기반으로 탭으로 구분된 파일에서 줄 제거

다른 파일과 공통 열을 기반으로 탭으로 구분된 파일을 처리하는 데 문제가 있습니다 Column_4.

첫 번째 파일은 매우 작을 수 있지만(행 100개 미만) 두 번째 파일은 80,000개가 훨씬 넘습니다(둘 다 약 30개 열).

file1.txt:

Column_1    Column_2    Column_3    Column_4
A1          B1          C1          D1
A2          B2          C2          D2
A3          B3          C3          D3

file2.txt:

Column_1    Column_2    Column_3    Column_4
Aa1          Bb1          Cc1          Dd1
Aa2          Bb2          Cc2          D2
Aa3          Bb3          Cc3          Dd3

desired_output.txt:

Column_1    Column_2    Column_3    Column_4
Aa2          Bb2         Cc2          D2

cut일련의 , grep등을 시도했지만 awk올바른 결과를 얻을 수 없는 것 같습니다.

최종 목표는 일치하지 않는 모든 행을 제거한 file2.txt다음 출력을 file1.txt.

답변1

귀하의 질문을 잘 이해했다면 이것은 일반적인 문제처럼 들립니다. Join("공통 필드의 행 결합")예:

join --header -j 4 -t $'\t' file1.txt file2.txt

일치하는 각 행에는 7개의 열이 있습니다.

이것이 내가 얻은 결과입니다(약간 수정된 데이터, 아래 참조).

Column_4    Column_1    Column_2    Column_3    Column_1    Column_2    Column_3
D2  A2  B2  C2  Aa2 Bb2 Cc2
D3  A3  B3  C3  Aa3 Bb3 Cc3
D8  A8  B8  C8  Aa8 Bb8 Cc8

(죄송합니다. 여기 라벨은 그다지 예쁘지 않습니다.)

Column_4는 일치하는 값이며 먼저 옵니다. 요구 사항에 따라 다른 열의 값을 비교할 수 있습니다.당신의 목표.

두 번째 테이블 열만 필요한 경우 다음을 사용하세요.

join --header  -j 4 -o 2.1,2.2,2.3,2.4 -t $'\t' file1.txt file2.txt 

그러나 join입력 파일은 정렬되어야 하므로 sort먼저 해당 파일을 전달하고 네 번째 필드에서 정렬해야 합니다.

join --header  -j 4 -o 2.1,2.2,2.3,2.4 -t $'\t' <(sort -k4 file1.txt) <(sort -k 4 file2.txt)

더 나은 시연을 위해 약간 다른 소스 파일을 제안합니다(흠, 그건 편집하기 전입니다).

파일 1:

Column_1    Column_2    Column_3    Column_4
A0  B0  C0  D0
A2  B2  C2  D2
A3  B3  C3  D3
A8  B8  C8  D8

파일 2:

Column_1    Column_2    Column_3    Column_4
Aa1 Bb1 Cc1 D1
Aa2 Bb2 Cc2 D2
Aa3 Bb3 Cc3 D3
Aa4 Bb4 Cc4 D4
Aa5 Bb5 Cc5 D5
Aa6 Bb6 Cc6 D6
Aa7 Bb7 Cc7 D7
Aa8 Bb8 Cc8 D8
Aa9 Bb9 Cc9 D9

답변2

해결책 awk:

$ awk -F"\t" 'FNR==NR{a[$4];next}; $4 in a' OFS="\t" file1 file2
Column_1    Column_2    Column_3    Column_4
Aa2          Bb2          Cc2          D2

관련 정보