서로 다른 파일의 서로 다른 두 열을 비교하고 그 안에 공통 항목을 가져오고 싶습니다.
파일 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 x
csvjoin은 열을 사용하여 파일을 결합합니다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