嵌套循环交叉污染
nested for loop cross pollution
我想将一大组 CSV 组合成多个 100 万行文件,但 CSV 的文件名以某种方式污染了我的大组输出。没有地方我回显 $file 变量,所以我很困惑为什么它们最终会出现在我的输出中。
我正在使用的数据已签入 github
batchnum=1
ctr=1
IFS=$'\n'
for file in `ls -1 *.csv`
do
for data in `cat $file`
do
echo $data >> batch${batchnum}.csv
ctr=$[ctr + 1]
if [ $ctr -eq 1000000 ]
then
batchnum=$[$batchnum + 1]
ctr=1
fi
done
done
这并不是一个严重的问题,但它让我摸不着头脑。
其中一些 CSV 文件中的数据在 shell 看来像是 glob。由于您的脚本 echo $data
以不加引号的方式执行,因此您将看到整个目录的内容在输出中扩展为 glob。您可以通过使用更多引号来解决此问题:
echo "$data" >> batch${batchnum}.csv
这也会导致 bash 不破坏空格。或者您可以禁用 glob 扩展:
set -f
echo $data >> batch${batchnum}.csv
我想将一大组 CSV 组合成多个 100 万行文件,但 CSV 的文件名以某种方式污染了我的大组输出。没有地方我回显 $file 变量,所以我很困惑为什么它们最终会出现在我的输出中。
我正在使用的数据已签入 github
batchnum=1
ctr=1
IFS=$'\n'
for file in `ls -1 *.csv`
do
for data in `cat $file`
do
echo $data >> batch${batchnum}.csv
ctr=$[ctr + 1]
if [ $ctr -eq 1000000 ]
then
batchnum=$[$batchnum + 1]
ctr=1
fi
done
done
这并不是一个严重的问题,但它让我摸不着头脑。
其中一些 CSV 文件中的数据在 shell 看来像是 glob。由于您的脚本 echo $data
以不加引号的方式执行,因此您将看到整个目录的内容在输出中扩展为 glob。您可以通过使用更多引号来解决此问题:
echo "$data" >> batch${batchnum}.csv
这也会导致 bash 不破坏空格。或者您可以禁用 glob 扩展:
set -f
echo $data >> batch${batchnum}.csv