서로 다른 파일의 두 열에 있는 단어를 비교하고 가져옵니다.

서로 다른 파일의 두 열에 있는 단어를 비교하고 가져옵니다.

서로 다른 파일의 서로 다른 두 열을 비교하고 그 안에 공통 항목을 가져오고 싶습니다.

파일 1

abc
123
ttt
kkk

파일 2

111 wed
222 kad
333 ttt
444 kkk

1열을 비교하고 싶어요파일 12열로 이동파일 2. 공통 항목이 있으면 file2에 일치하는 줄을 인쇄하고 싶습니다.

예상되는 결과:

333 ttt
444 kkk

결과를 얻기 위해 다음 명령을 시도했습니다.

awk -F 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2

또는

join -t -1 1 -2 2 -o 2.1,2.2 file1 file2

그러나 예상한 결과를 얻지 못합니다.

답변1

awk 'NR==FNR {a[$1]; next} $2 in a' file1 file2
333 ttt
444 kkk

위의 내용은 원하는 것입니다.to compare column 1 of file1 to column 2 of file2. If there are any common entries, I want to print the match lines from file2

답변2

awk두 개의 필드를 키로 사용하기 때문에 실패하지만 필드 file1가 하나뿐이므로 해당 두 필드는 c배열에 나타나지 않습니다. 또한 -F필드 구분자를 제공하지만 실제로는 필드 구분자를 제공하지 않는 옵션을 사용하고 있습니다 . 이는 필드 구분자가 awk 스크립트 자체가 됨을 의미합니다.

awk -F 'script' file

당신이 시도하고 있는 작업 버전은 다음과 같습니다 awk.

$ awk  'NR==FNR{c[$1]++;next};c[$2] ' file1 file2
333 ttt
444 kkk

필요한 것보다 더 많은 메모리를 사용하지 않는 보다 효율적인 버전은 다음과 같습니다.

$ awk  'NR==FNR{c[$1]}; $2 in c' file1 file2 
333 ttt                 
444 kkk   

join또한 이 옵션을 오용 했습니다 -t. -F와 마찬가지로 awk-t인수를 받지만 인수를 제공하지 않습니다. 다음으로 join입력을 정렬하라는 요청을 받습니다. 귀하의 방법의 작동 버전은 다음과 같습니다 join.

$ join  -1 1 -2 2 -o 2.1,2.2 <(sort file1) <(sort -k2 file2)
444 kkk
333 ttt

답변3

사용 csvjoin(도구 세트의 일부 csvkit):

file1이 다음과 같다고 가정합니다.

x
abc
123
ttt
kkk

file2는 다음과 같습니다.

y x
111 wed
222 kad
333 ttt
444 kkk

다음 명령을 사용하면 됩니다:

csvjoin -d' ' -c x file{2,1} | tr ',' ' '
  • -d' '구분 기호로 공백을 사용합니다.

  • -c xcsvjoin은 열을 사용하여 파일을 결합합니다 x.

@terdon이 헤더가 없는 파일에 대한 위 명령을 수정했습니다. 명령은 다음과 같이 변경할 수 있습니다.

csvjoin -H -d ' ' -c 2,1 fil{2,1} | tr ',' ' ' | tail -n +2

위 명령은 -H헤더(매개변수)가 없는 파일에 대해 작동합니다.

명령은 tail두 번째 레코드()에서 출력을 시작합니다 +2. 이는 csvjoin명령이 출력 시작 부분에 새 헤더 줄을 추가하기 때문입니다 .

답변4

#!/usr/bin/python
k1=open('file1','r')
for f1 in k1:
    k2=open('file2','r')
    for f2 in k2:
        if f1.strip() in f2.strip():
            print f2.strip()
~                                  

산출

333 ttt
444 kkk

관련 정보