2017-02-14 5 views
1

У меня есть сценарий:Как применить команду вставки рекурсивно в сценарии

paste -d, <(cut fileA1 -d, -f1-6) <(cut fileB1 -d, -f7) > fileC1 

который принимает два csv текстовые файлы fileA1 и fileB1, копирует первые шесть столбцов fileA1 и приклеивает их (с заменой) в первые 6 столбцов fileB1. Затем вывод сохраняется в новый файл fileC1.

Теперь я хотел бы расширить это до п файлов в folder A (fileA1...fileAn) и folder B (fileB1...fileBn) и сохраните результат файлов folder C (fileC1...fileCn). Все входные файлы имеют равное количество строк.

Я пришел с этим

fileA1=find /path/to/folderA -name '.csv' 
fileB1=find /path/to/folderB -name '.csv' 

paste -d, <(cut fileA1 -d, -f1-6) <(cut fileB1 -d, -f7) > *.csv 

Но это не работает. Есть идеи?

+0

Обратите внимание, что 'cut' и' paste' не являются лучшие инструменты для работы с файлами CSV в первую очередь. Они не могут корректно обрабатывать записи, содержащие поля, содержащие запятую. – chepner

ответ

2

Вам нужен явный цикл. Не похоже, что вы используете какую-либо функцию find, которая не может быть выполнена в оболочке, поэтому я пропущу ее.

a_files=(/path/to/folderA/*.csv) 
b_files=(/path/to/folderB/*.csv) 

Далее я буду предполагать, что ваши имена файлов таковы, что два массива синхронизированы; первый элемент каждого идти вместе, и т.д.

for ((i=0; i<"${#a_files[@]}"; i++)); do 
    paste -d, <(cut "${a_files[i]}" -d, -f1-6) \ 
       <(cut "${b_files[i]}" -d, -f7-) > fileC"$i".csv 
done 

Здесь я предполагаю, что имя выходного файла может быть построен, как это. (Это также означает, что вы можете сделать то же самое для входных файлов, единственной переменной здесь будет диапазон 0-n, который i выполняет итерацию.)

+0

Спасибо за ваш вклад @chepner. Он работал с несколькими изменениями: «$ {a_files [@]}» изменен на '' $ {# a_files [@]} "'и' (cut" $ {b_files [i]} "-d, -f1-7) 'Changed to' (cut "$ {b_files [i]}" -d, -f7-) '. Без второго изменения fileC состоял только из первых 6 и 7 столбцов из A и B соответственно. Скрипт обрабатывал 200 файлов по 300 Мбайт каждый всего за 10 минут! – Buzz

+0

Спасибо, я включил изменения в ответ; первая была опечаткой, а вторая из-за того, что я не читал оригинальный код тщательно. – chepner