두 개의 열과 조건을 기반으로 두 파일의 교차

두 개의 열과 조건을 기반으로 두 파일의 교차

두 개의 파일이 있습니다. 파일은 다음 내용으로 탭으로 구분됩니다.

col1.     col2     col2       col4
Stef.     123       SE        383
Lena      938       Y          X
John      738       T          Y
Stef      827       uq         hd
Stef      81        tt         vv

열이 하나만 있는 다른 파일이 있습니다.

837
123
839
827

첫 번째 파일의 두 번째 열이자 두 번째 텍스트 파일의 유일한 관심 열인 새 파일을 만들고 싶습니다. 하지만 첫 번째 파일의 첫 번째 열도 고려하고 싶습니다.

나는 다음을 사용하여 크로스오버를 수행할 수 있다는 것을 알고 있습니다.

join <(sort file1) <(sort file2)

그런데 두 번째 파일의 첫 번째 열과 첫 번째 파일의 두 번째 열에 어떻게 지정해야 할지 모르겠어서, 첫 번째 파일의 첫 번째 열에 해당하는 제공된 값을 기준으로 교차를 하려고 합니다. 예를 들어, 첫 번째 파일의 첫 번째 열이 Stef인 경우 두 파일 간의 교차 부분만 원하므로 결과 파일은 다음과 같습니다.


col1.     col2     col2       col4
Stef.     123       SE        383
Stef      827       uq         hd

bash와 awk를 사용하여 어떻게 이를 달성할 수 있습니까? Pandas에서 이 작업을 시도했지만 파일이 매우 크기 때문에 Jupyter 노트북에 로드하는 데 시간이 오래 걸립니다. 통찰력을 높이 평가하겠습니다.

내 awk 스크립트:

awk 'NR==FNR{A[$1];next}$2 in A' file2.txt file1.txt > sample.txt

답변1

질문을 올바르게 이해했는지는 모르겠지만 연결 매개변수로 사용하려는 열을 기준으로 파일을 정렬해야 합니다.

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2)

123 Stef. SE 383
827 Stef uq hd

편집: 특정 주문을 원하는 경우:

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2) | awk -F " " '{print $2 " " $1 " " $3 " " $4}'

Stef. 123 SE 383
Stef 827 uq hd

편집: 필터에 grep을 추가했습니다. 예를 들어 Stef만 표시합니다. Stef 대신(점 없음)

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2) | awk -F " " '{print $2 " " $1 " " $3 " " $4}' | grep "Stef\."

Stef. 123 SE 383

마지막 편집 (아마도)

쉬운 부분을 놓친 것 같습니다.

awk 'NR==FNR{A[$1];next}$2 in A' file2.txt file1.txt | grep "^Stef"

답변2

$1정확한 일치를 원하는지 여부에 따라 다릅니다 Stef.

$ awk 'NR==FNR{a[$1]; next} (FNR==1) || (($2 in a) && ($1=="Stef"))' file2 file1
col1.   col2    col2    col4
Stef    827     uq      hd

또는 로 시작하는 단어 Stef, 예 Stef.:

$ awk 'NR==FNR{a[$1]; next} (FNR==1) || (($2 in a) && ($1~/^Stef/))' file2 file1
col1.   col2    col2    col4
Stef.   123     SE      383
Stef    827     uq      hd

관련 정보