N개의 csv 파일을 하나의 csv 파일로 연결

N개의 csv 파일을 하나의 csv 파일로 연결

사용 가능한 모든 CSV 파일을 하나로 연결하는 셸 스크립트를 작성해야 합니다. 이러한 모든 CSV 파일은 유사한 구조(예: 동일한 헤더 및 열 수)를 가지며 파일에는 공통 접두사가 있습니다 GFP.

예를 들어, 어느 날 다음과 같은 파일이 생길 수도 있습니다.

GFP_20210609.csv
GFP_20210610.csv

아니면 가끔 이런 파일이 많이 있을 수도 있습니다. 여기서 문제는 하루에 얼마나 많은 파일이 나타날지 확신할 수 없다는 것입니다(하루에 5개 이하의 CSV 파일을 가정).

저는 쉘 스크립팅을 처음 접했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

sed 1d GFP_20210610.csv > GFP_20210610_NO_HEADER.csv
cat GFP_20210609.csv GFP_20210610_NO_HEADER.csv > GFP_FINAL.csv

답변1

노력하다awk

awk 'NR==1||FNR>1' GFP*.csv > output.csv

이렇게 하면 중복 헤더를 억제하기 위해 두 번째 줄( FNR>1각 파일의 줄 카운터가 1보다 크다는 의미)부터 시작하는 각 파일의 모든 줄이 인쇄되지만, 첫 번째 줄인 첫 번째 줄( NR==1)을 인쇄해야 합니다. 파일.

그러면 출력이 파일로 리디렉션됩니다 output.csv.

awk이 구문은 규칙 블록 외부에서 발견된 조건( ) { ...}이 true인 경우 현재 행이 인쇄된다는 사실을 활용합니다 . 이 경우 실제로 편집을 원하지 않고 입력 파일만 필터링하기 때문에 규칙 블록을 완전히 생략할 수 있습니다.

답변2

먼저 헤더 파일을 한 번 생성하고 나머지 csv 파일과 동일한 폴더에 보관합니다.

head -qn 1 GFP_20210609.csv > common.header

공통_헤더.csv선택한 csv 파일의 첫 번째 행을 포함합니다(말한 대로 모든 csv 파일의 헤더는 동일합니다). 이 파일을 한 번 빌드하고 나중에 사용할 수 있도록 동일한 디렉터리에 보관해야 합니다.

head명령이 먼저 출력됩니다.N헤더 파일의 경우 "1"인 텍스트 파일의 줄입니다.

tail명령 출력이 마지막입니다.N텍스트 파일의 줄. 헤더 중복을 피하기 위해 "1"부터 모든 csv 파일의 첫 번째 행을 무시합니다.

추가의 -큐(quiet) 매개변수를 사용 head하여 tail최종 파일에 필요하지 않은 추가 출력 정보를 방지합니다.

다음 줄은 스크립트의 소스 코드입니다.

cat common.header > FINAL.csv && tail -qn 1 GFP_*.csv >> FINAL.csv

두 명령 cat과 는 taila로 연결되어 실행될 것임을 &&나타냅니다 .tail오직cat명령이 성공 하면 .

(*) 참고: 다음과 같이 tail -qn 1...쓸 수도 있습니다 tail -q -n 1.... 와 같은 의미입니다.

답변3

모든 eof 조건에서 명시적 으로 perl파일 핸들을 닫으면 라인 카운터가 재설정됩니다. 절대 첫 번째 행의 경우 스칼라 변수 $nr을 가져와서 미리 증가시킵니다.

perl -lne 'print if
  ++$nr==1||$.>1;
  eof && close(ARGV);
' GFP_*.CSV > total.csv

GNU sed-s파일을 개별적으로 처리하는 분할 스트림 옵션 과 함께 사용됩니다.

{
head -n 1 "$(printf '%s\n' GFP_*.CSV |head -n 1 -)"
sed -se 1d GFP_*.csv
} > total.csv

관련 정보