嵌套循环交叉污染

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