파일 1.txt
name
abc
xyz
pqr
파일 2.txt
name,addr,id
abc,hj,1
pqr,hj.2
jkd,hj,9
jh,jd,2
결과물 파일
name,addr,id
abc,hj,1
pqr,hj.2
답변1
사용 join
:
join -t, -o 0,1.2,1.3 <(sort <(tail -n +2 file2)) <(sort <(tail -n +2 file1))
abc,hj,1
pqr,hj,2
-t,
입력/출력 필드 구분 기호를 다음과 같이 지정합니다.반점.-o
지정된 필드만 출력합니다.0
연결(첫 번째) 필드입니다(1.1
또는 로 대체 가능2.1
). 형식은 다음과 같습니다X.Y
.Y
X
tail -n +2 infile
첫 번째 행을 제외한 모든 행을 반환합니다.머리글철사.sort ...
각 입력 파일을 정렬합니다.
또는 다음을 사용하여 awk
:
awk -F, 'NR==FNR {!seen[$1]; next} $1 in seen' file1 file2
name,addr,id
abc,hj,1
pqr,hj,2
-F,
지정된 입력 필드 구분 기호는 다음과 같습니다.반점.NR==FNR
;NR
첫 번째 레코드/라인 읽기에서 1로 설정됩니다.앗단일 입력 파일 또는 여러 파일의 모든 레코드/라인을 읽을 때까지 증가하며FNR
첫 번째 레코드/라인 읽기에서 1로 설정됩니다.앗현재 입력 파일에서 모든 레코드/라인을 읽을 때까지 증가하고 다음 파일에서 다시 1로 재설정됩니다NR==FNR
.앗첫 번째file1
입력 파일을 읽는 중이며 후속 블록이 실행됩니다.seen
다음 줄로 호출되는 연관 배열을 생성합니다.파일 1이전에 설정되지 않은 경우 이 배열에 대한 인덱스로 사용됩니다.$1 in seen
:두 번째 항목만 실행되고file2
해당 파일의 첫 번째 열이 배열의 키와 일치하는지 확인한seen
다음 인쇄합니다.
답변2
이것은 작동합니다:
grep --color=never -f <(cut -d, -f1 file1.txt | sed 's#.*#^\0,#') file2.txt
설명하다:
grep -f
: FILE에서 한 줄에 하나씩 패턴을 가져옵니다.--color=never
(선택 사항)grep
일치하는 출력에서 색상을 제거합니다.<([...])
다음과 같이 대괄호 사이의 내용을 기반으로 파일 설명자를 생성하는 구문입니다.cut -d, -f1 file1.txt
file1.txt의 첫 번째 열을 반환합니다.sed 's#.*#^\0,#'
^column1,
에 대한 올바른 패턴을 생성하는 것처럼 첫 번째 열을 읽게 만듭니다grep
.
오류를 피하기 위해 헤더를 제외하려면(귀하의 예에서는 필요하지 않음) 다음을 사용하십시오.
head -n 1 file2.txt && \
grep --color=never -f <(tail -n +2 file1.txt | cut -d, -f1 | sed 's#.*#^\0,#') file2.txt
두 명령 모두 다음을 반환합니다.
name,addr,id
abc,hj,1
pqr,hj.2