두 파일을 비교하고, 각 파일의 열 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 - 예를 들어 c
from file2는 와 일치할 뿐만 cat
아니라 jack
file1에서도 일치합니다.
답변3
다음 옵션을 사용하여 '의 옵션을 사용하는 grep
솔루션 (cas에서 제안한 대로):-f
sed
$ grep -f <(sed 's/^/^/' file2) file1
c cat
e eagle
f fire
명령은 의 각 줄 시작 부분에 sed 's/^/^/' file2
캐럿을 추가합니다 . 절차적 치환() 옵션을 사용하여 이 출력을 패턴 입력 파일 로 사용합니다.^
file2
grep
-f
<(…)
이 명령은 명령 대체 패턴과 일치하는 grep
행을 인쇄합니다. 해당 줄과 일치하려면 패턴의 문자가 file1
필요합니다.^
시작주어진 캐릭터로.