我在一条路径上放置了大约 300 个 CSV 文件。这些文件名有 3 个不同的类别*_PROD.csv
,即 、*_DEV.csv
和*_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
为 just以跳过备份。-i