머리글을 병합하지 않고 여러 CSV 파일 병합 .CSV 파일을

cat명령을 사용하여 여러 .CSV 파일을 병합해야 하지만 각 파일의 헤더를 복사하지 않아도됩니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?



답변

여기에cat 설명 된대로 명령 이상이 필요 합니다 .

3 개의 CSV 파일 ( file1.csv, file2.csv)이 있고 파일 file3.csv에 합류하고 bigfile.csv헤더를 항상 첫 번째 줄 (만)로 지정한 다음

또는 (첫 번째 파일 “file1.csv”의 헤더 유지) :

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

또는 (이름이 “file”로 시작하는 모든 파일에서 헤더를 제거하십시오) :

awk 'FNR > 1' file*.csv > bigfile.csv


답변

나는 최고 답변에 동의하지만 다음 시나리오로 확장 할 것을 제안합니다 (댓글을 달 수 없습니다).

출력 파일에 헤더 (한 번)를 포함 시키려면 올바른 스크립트는 다음과 같습니다.

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR은 단일 파일에서 처리 된 레코드 수를 나타냅니다. 그리고 NR은이를 전 세계적으로 나타내므로 첫 번째 라인이 허용되고 나머지는 이전과 같이 무시됩니다.


답변

{ ; }프로세스 대체 ( <()) 대신 그룹 명령 ( )을 사용할 수도 있습니다 .

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

또한 파일이 빈 줄 ( \r\n) 로 끝나는 한 CRLF 줄 끝에서 작동합니다 .

POSIX 1003.1-2001은 헤드 및 테일의 숫자 전용 버전을 더 이상 사용하지 않으며 일부 환경에서는 경고를 표시합니다.


답변

청크 스크립트를 위해 동일한 열을 가진 두 개의 큰 CSV를 더 큰 CSV로 연결해야합니다 (데이터에 고유 ID가 없음).

먼저 두 번째 CSV에서 헤더를 가져 왔습니다.

awk 'FNR > 1' file2.csv > file2_noheading.csv

다음으로 다음을 통해 연결

cat file1.csv file2_noheading.csv > newfile.csv


답변

위의 명령 순서를 사용하면 다음과 같은 파일이 생성되었습니다.

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

하나의 헤더 행과 모든 관련 값을 사용하여 올바른 CSV로 만들기 위해 다음과 같은 sed주문을 사용했습니다 …sed -ie "/^$/d;/^==>/d" bigfile.csv


답변

많은 파일이있는 경우 더 쉬운 솔루션 :

awk 'FNR > 1' *.csv > merged.csv

큰 파일을 편집하기 위해 돌아가서 헤더를 다시 추가하십시오.


답변