2015-01-26 2 views
0

Я хочу объединить большую группу CSV в несколько 1 млн. Строк файлов, и так или иначе имена файлов 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 

Это не очень важный вопрос, но он оставил меня почесал голову.

+1

Есть несколько [подводные камни] (http://mywiki.wooledge.org/BashPitfalls) в приведенном выше сценарии. Один из них может быть виноват, хотя я не могу тривиально определить кого-либо из них в качестве прямой причины вашей жалобы. Но мне кажется, что весь сценарий можно переписать в одной строке: 'cat * .csv | split -l 1000000 -' – kojiro

+0

Спасибо за это, это гораздо более элегантное решение. – Bryan

+0

Замечание '$ [ctr + 1]' любопытно. Похоже, что это вариант [недокументированный] (http://www.gnu.org/software/bash/manual/bash.html) на '$ ((ctr + 1))'. –

ответ

0

Некоторые из этих файлов CSV имеют в них данные, которые выглядят как глобусы для оболочки. Поскольку ваш скрипт делает echo $data неуказанным образом, вы увидите содержимое всего каталога, расширенного в виде глобусов на вашем выходе. Вы можете исправить это с помощью нескольких цитат:

echo "$data" >> batch${batchnum}.csv 

Какой бы также привести к Баш не затирать пробелов. Или вы можете отключить расширение Глоб:

set -f 
echo $data >> batch${batchnum}.csv 
+0

Спасибо, я пропустил цитаты. Этот код работает и сейчас. – Bryan

Смежные вопросы