사용 가능한 모든 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
과 는 tail
a로 연결되어 실행될 것임을 &&
나타냅니다 .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