2015-10-28 3 views
1

Мне нужна помощь, пытаясь найти эффективный способ разобрать путь к файлу большого количества небольших файлов stdout и создать из них файлы .csv.Эффективно Разбор большого количества файлов

Пример: найти $ PWD -name стандартный вывод

/корень/размер/6/цвет/красный/стандартный вывод

/корень/размер/3/цвет/зеленый/стандартный вывод

Запуск этого скрипт создаст

6-red.csv

3-green.csv

Этот цикл работает на тысячах файлов, и я стараюсь, чтобы убедиться, что это правильное решение.

Любое направление было бы очень полезно. Спасибо!

dirfiles=($(find $PWD -name stdout)) 
for outfile in "${dirfiles[@]}" 
do 
    thisResult=$(cat $outfile) 
    IFS='/' read -a params <<< "$outfile" 

    for index in "${!params[@]}" 
    do 
     param=${params[index]} 

     if [ "$param" = "size" ]; then 
     size=${params[index+1]} 
     fi 

     if [ "$param" = "color"]; then 
     color=${params[index+1]} 
     fi 

    done 

echo $thisResult 1>>outputCSV/${size}-{color}.csv 
done 
+0

Является ли это работает? Вопрос в том, можно ли повысить эффективность? Вы ищете приемлемые для оболочки решения или другие инструменты (например, 'awk',' perl' и т. Д.)? Имеет ли значение, что это не безопасно для каталогов с пространством в именах? –

+0

Не могли бы вы быть более конкретными относительно ваших входных и выходных форматов? –

+0

Да, это работает, но требуется очень много времени для обработки через растущий набор данных. Я ищу наиболее эффективный метод, будь то использование оболочки или других инструментов. (и т. д., perl, python, awk). – jfran

ответ

0

Использование perlrename (prename/ЕН/переименовывать):

# Allow ** to match dirs 
shopt -s globstar 
rename 's:size/::;s:color/::;s:/:-:g;s:-stdout:.csv:' **/stdout 

Или, если вы хотите получить копию:

find | grep stdout | parallel cp {} '{= s:[.]/::; s:size/::; s:color/::; s:/:-:g; s:-stdout:.csv: =}' 
Смежные вопросы