대용량 파일이 있습니다: (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