나는 큰 데이터 세트 ~ 100GB와 더 작은 csv 파일 ~ 100,000을 가지고 있습니다. 모든 .csv 파일을 함께 병합하는 가장 빠른 방법을 원합니다. 파일은 두 개의 다른 폴더에 있습니다.
- 누군가는 glob을 사용하는 대신 두 폴더에 있는 파일 이름을 포함하는 두 개의 파일을 만들고 해당 파일 이름을 사용하여 디렉터리를 반복하여 출력 파일을 추가할 것을 제안했습니다
ls *
. Linux를 사용하여 어떻게 이를 달성할 수 있습니까? 나는 이것에 대해 매우 새로운 것이며 누구든지 나를 도울 수 있다면 매우 감사하겠습니다. - 다른 방법이 있는 경우 데이터세트를 고려하여 결과를 얻으세요.
답변1
내가 올바르게 이해했다면 모든 파일에서 하나의 (100GB 크기?) 파일을 만들고 싶습니다. 이 경우 고양이는 다음과 같이 할 수 있습니다.
cat foo1 foo2 bar1 bar2 > newfile
아니면 당신의 경우
cat folder1/* folder2/* > newfile
그러면 폴더1과 폴더2의 모든 파일이 가져와서 (텍스트로) 새 파일로 병합됩니다. cat은 파일을 끝에만 추가합니다(즉, 줄을 추가합니다).
그러나 이렇게 하면 이전 파일이 유지되므로 두 배의 공간이 필요하므로 개별적으로 처리할 수도 있습니다.
for f in folder1/* folder2/* ; do
cat $f >> newfile && rm $f
done
이렇게 하면 모든 파일이 추가된 다음 제거됩니다.
이것이 당신이 찾고 있는 것입니까?
답변2
다음과 같이 시도해 보세요.
find /path/to/dir1 /path/to/dir2 -type f -name '*.csv' -exec cat {} + >/path/to/merged.csv
병합된 파일을 입력 디렉터리에 두지 않도록 하세요. :)
답변3
모든 CSV 파일이 동일한 구조(헤더)를 갖고 레벨 2 하위 디렉터리에 배치되는 경우 32GB 또는 64GB 메모리로 사용할 수 있는 DuckDB를 사용하는 것이 좋습니다.
모든 파일을 가져오는 방법은 다음과 같습니다.
CREATE TABLE merge AS SELECT * from read_csv_auto('*/*/*.csv');
생성된 테이블을 빠르게 찾아보세요.
SUMMARIZE SELECT * from merge;
마지막으로 단일 csv 파일로 내보내기
COPY merge TO 'export.csv' (HEADER, DELIMITER ',');