또 다른 솔루션

 또 다른 솔루션

대용량 파일이 있습니다: (file1.csv)

id,code,N
10214411,008.8,1
10214411,038.9,1
10214411,04.81,1
10214411,07.22,1

ID 목록이 포함된 두 번째 열을 기반으로 새 파일을 선택하고 생성하려고 합니다. 예:

두 번째 파일의 두 번째 열에는 큰 ID 목록이 있습니다. 예: (file2.csv):

0.008.8
07.22

결과: (파일 3.csv)

id,code,N
10214411,008.8,1
10214411,07.22,1

답변1

0.008.8귀하의 질문에 있는 file2.csv에 오타가 있고 다음과 같아야 한다고 가정하면 008.8다음과 같이 보입니다.

awk -F, 'NR==FNR{a[$1]; next} FNR==1 || $2 in a' file2.csv file1.csv > file3.csv

예를 들어:

$ awk -F, 'NR==FNR{a[$1]; next} FNR==1 || $2 in a' file2.csv file1.csv
id,code,N
10214411,008.8,1
10214411,07.22,1

답변2

이와 같이 bash쉘을 사용 paste하고 다음을 수행하십시오 awk.

입력 파일

$ cat file2.csv
008.8
07.22

암호

쉘 변수에 몇 가지 트릭을 사용하여 정규식을 만드십시오.

re="^($(paste -sd '|' file2.csv))$" 

...이제 $re변수에 정규식이 포함됩니다.^(008.8|07.22)$

그런 다음 re를 awk에 변수로 전달합니다. ( ${re//./\\.}bash 인수는 백슬래시 점으로 확장됩니다 => ^(008\.8|07\.22)$)

awk -F, -v re="${re//./\\.}" 'NR==1 || $2 ~ re' file1.csv | tee file3.csv 

 산출

$ cat file3.csv
id,code,N
10214411,008.8,1
10214411,07.22,1

 또 다른 솔루션

(검증되지 않은)

{ 
    echo 'id,code,N'
    while IFS=, read -r _ id __; do
        awk -F, -v id=$id '$2==id' file1.csv
    done < file2.csv 
} | tee -a file3.csv

답변3

head그리고 grep함께 작업을 수행합니다. grep -F따라서 grep은 file2의 행을 정규 표현식이 아닌 고정 문자열로 처리합니다.

{
  head -n 1 file1.csv
  grep -F -f file2.csv file1.csv
}
id,code,N
10214411,008.8,1
10214411,07.22,1

여기서는 동시에 두 명령의 출력을 더 쉽게 리디렉션할 수 있도록 중괄호를 사용하고 있습니다.

{ cmd1; cmd2; ...; } > output.txt

관련 정보