cat
명령을 사용하여 여러 .CSV 파일을 병합해야 하지만 각 파일의 헤더를 복사하지 않아도됩니다.
이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
답변
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
큰 파일을 편집하기 위해 돌아가서 헤더를 다시 추가하십시오.