고르지 않은 열이 있는 두 파일의 교차점: 공통 열이 있는 행을 인쇄합니다.

고르지 않은 열이 있는 두 파일의 교차점: 공통 열이 있는 행을 인쇄합니다.

두 파일을 비교하고, 각 파일의 열 1 사이에서 공통 행을 찾고, 파일 1의 전체 행(여러 열)을 인쇄하고 싶습니다.

파일 1:

사과
고양이
전자 독수리
녹색   
하마   
내 이글루
제이잭

그리고

파일 2:

두번째
이자형
에프

출력이 다음과 같기를 원합니다.

고양이
전자 독수리

어떤 도움이라도 대단히 감사하겠습니다.

답변1

이것이 coreutils의 작업입니다 :-)

파일이 이미 정렬되어 있고 첫 번째 열에 공개 필드가 있는 경우:

$ join file1 file2
c cat
e eagle
f fire

파일이 정렬되지 않은 경우:

join <(sort file1) <(sort file2)

답변2

$ awk 'NR==FNR { a[$1]++ ; next}; $1 in a' file2 file1
c   cat
e   eagle
f   fire

이는 (첫 번째 파일 이름 매개변수)를 읽어서 file2배열에 저장합니다 a. NR(지금까지 본 총 입력 레코드 수)가 (현재 입력 파일의 입력 레코드 수)와 같은지 확인하여 FNR첫 번째 파일을 읽고 있는지 감지합니다 .

그런 다음 (두 번째 파일 이름 매개 변수)을 읽고 file1첫 번째 필드가 배열에 있으면 a일치하는 입력 줄을 인쇄합니다( awk예를 들어 성공적인 테스트 결과에 대한 기본 작업 에서는 $1 in a입력 줄을 인쇄하는 것입니다 $1 in a. ) 와 동일합니다 $1 in a {print}.


그런데, 대부분의 경우 이와 같은 작업을 수행할 수 있지만 grep -f file2 file1이는 file2의 내용과 일치합니다.어딘가에in file1 - 예를 들어 cfrom file2는 와 일치할 뿐만 cat아니라 jackfile1에서도 일치합니다.

답변3

다음 옵션을 사용하여 '의 옵션을 사용하는 grep솔루션 (cas에서 제안한 대로):-fsed

$ grep -f <(sed 's/^/^/' file2) file1
c   cat
e   eagle
f   fire

명령은 의 각 줄 시작 부분에 sed 's/^/^/' file2캐럿을 추가합니다 . 절차적 치환() 옵션을 사용하여 이 출력을 패턴 입력 파일 로 사용합니다.^file2grep-f<(…)

이 명령은 명령 대체 패턴과 일치하는 grep행을 인쇄합니다. 해당 줄과 일치하려면 패턴의 문자가 file1필요합니다.^시작주어진 캐릭터로.

관련 정보