두 개의 csv + 첫 번째 파일의 첫 번째 열 + 두 번째 파일의 첫 번째 열을 연결하고 일치하는 열 데이터만 가져옵니다.

두 개의 csv + 첫 번째 파일의 첫 번째 열 + 두 번째 파일의 첫 번째 열을 연결하고 일치하는 열 데이터만 가져옵니다.

파일 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.YX

  • 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.txtfile1.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

관련 정보