다른 파일의 ID 목록을 기반으로 CSV 파일 필터링

다른 파일의 ID 목록을 기반으로 CSV 파일 필터링

다음 형식의 파일 1을 포함하는 큰 csv 파일이 있습니다.

id,ICD,CT
16214497,008.8,1
16227244,401.1,45
27154870,780.79,1

ID(제목 ID) 목록이 있는 또 다른 txt 파일이 있습니다. 파일 2:

id
16214497
27154870

파일 2의 ID 목록으로 데이터가 제한된 다른 파일을 원합니다.

결과물 파일:

id,ICD,CT
16214497,008.8,1
27154870,780.79,1

답변1

파일에 동일한 순서로 공통 줄이 있는 경우

join -t, -j1 file1.txt file2.txt

설명하다

자세한 내용은 을 참조하세요 man join. 기본적으로 join이 두 파일은 "페어링할 수 없는 줄"을 건너뜁니다. 구분 기호는 쉼표 -t,이며 필드 1에서 연결됩니다 -j1.

답변2

csvjoinPython 기반 사용csvkit

$ csvjoin -Ic id file\ 1 file\ 2
id,ICD,CT
16214497,008.8,1
27154870,780.79,1

-I플래그는 유형 추론을 비활성화하여 해당 필드가 008.8숫자가 아닌 문자열로 처리되도록 합니다(이로 인해 형식이 다시 지정될 수 있음). 이 방법은 DOS/Windows 스타일 줄 끝을 투명하게 처리하는 것으로 보입니다.


awk를 사용한 대체 빠른 연결:

awk -F, 'NR==FNR {a[$1]; next} $1 in a' file\ 2 file\ 1

파일에 DOS/Windows 줄 끝(일반 LF 대신 CRLF)이 있는 경우 다음을 시도해 볼 수 있습니다.

awk -vRS='\r\n' -F, 'NR==FNR {a[$1]; next} $1 in a' file\ 2 file\ 1

dos2unix아니면 먼저 파일을 변환하는 등의 방법을 사용하세요 tr.sed

답변3

그리고 :grepsed

^file2의 각 줄 시작 부분에 a를 추가 하고 ,file2의 각 줄 끝에 a를 추가한 후 다음을 사용할 수 있습니다 grep.

grep -f <(sed 's/^/^/;s/$/,/' file2) file1

-f파일에서 패턴을 읽는 옵션 입니다(이 경우 실제 파일이 아니라 프로세스 대체에서 <(…)).

관련 정보