![두 개의 열과 조건을 기반으로 두 파일의 교차](https://linux55.com/image/195712/%EB%91%90%20%EA%B0%9C%EC%9D%98%20%EC%97%B4%EA%B3%BC%20%EC%A1%B0%EA%B1%B4%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%EB%91%90%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EA%B5%90%EC%B0%A8.png)
두 개의 파일이 있습니다. 파일은 다음 내용으로 탭으로 구분됩니다.
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