한 경로에 약 300개의 CSV 파일이 있습니다. 이러한 파일 이름에는 *_PROD.csv
, *_DEV.csv
및 3가지 카테고리가 있습니다 *_UAT.csv
.
이러한 파일에는 많은 빈 줄(약 1000개)이 있으며 프로세스가 파일을 경로에 복사할 때 레코드 끝에 삽입됩니다.
이 모든 파일에서 빈 줄을 제거하고 싶습니다. 공백을 제거한 후 이 파일을 병합해야 합니다.
나는 이것을 시도했습니다 :
sed -i '/^$/d' ${File_Path}*_PROD.csv
sed -i '/^$/d' ${File_Path}*_DEV.csv
sed -i '/^$/d' ${File_Path}*_UAT.csv
그러나 이는 예상대로 작동하지 않았습니다.
끝에서 빈 줄을 제거한 후에는 다른 작업을 수행해야 하기 때문에 파일을 변경하지 않고 유지하고 싶습니다.
제안해주세요.
참고용 내 스크립트:
File_Path=/File_Path
dos2unix ${File_Path}*_PROD.csv
dos2unix ${File_Path}*_DEV.csv
dos2unix ${File_Path}*_UAT.csv
sed -i '/^\s*$/d' ${File_Path}*_PROD.csv
sed -i '/^\s*$/d' ${File_Path}*_DEV.csv
sed -i '/^\s*$/d' ${File_Path}*_UAT.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*PROD.csv > Merged_PROD.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*_DEV.csv > Merged_DEV.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*_UAT.csv > Merged_UAT.csv
답변1
CSV 파일에는 Windows 줄 끝이 있습니다. 따라서 먼저 Linux 형식으로 변환해야 합니다.
dos2unix yourfile
당신을 위해 그것을 할 것입니다.
상자에 없으면 다음 dos2unix
과 같이 동일한 결과를 얻을 수 있습니다.
sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 or higher
tr -d \r <infile >outfile # GNU tr version 1.22 or higher
~에 따르면sed1line.txt.
파일이 Unix 형식으로 변환되면 일반적인 sed
명령이 예상대로 작동합니다.
빈 줄의 공백을 확인하세요.sed '/^\s*$/d' yourfile
하나의 sed 명령으로 모두 :
sed -e 's/\r// -e /^\s*$/d' yourfile > outputfile
답변2
"빈" 줄에는 공백 문자가 포함될 가능성이 높습니다(캐리지 리턴은 DOS 또는 Windows 프로그램으로 작성된 파일에서 주의해야 할 의심스러운 사항입니다). 다음 사항을 고려하도록 모델을 변경할 수 있습니다.
sed -i -e '/^[[:space:]]*$/d' \
"${File_Path}"*_{PROD,DEV,UAT}.csv
(변수 확장도 인용하도록 주의하세요!)
답변3
먼저 병합한 다음 빈 줄을 삭제하면 약간 더 효율적입니다. 다음을 수행할 수 있습니다.
cat *_PROD.csv > MERGED_PROD.csv
dos2unix MERGED_PROD.csv
perl -i.bak -ne 'print if /\S/' MERGED_PROD.csv
마지막 Perl 줄은 원본 MERGED_PROD.csv
의 복사본을 MERGED_PROD.csv.bak
.-i.bak
-i