2013-07-15 1 views
0

У меня есть сценарий, который читается в строках из файла, берет первый столбец каждой строки и присоединяется к файлу с именем этой строки (я пытаюсь написать много разных файлов с именем $ id.txt).Могу ли я сделать этот скрипт bash, который пишет в несколько файлов, запускается быстрее?

Возможно ли иметь скрипт, который делает что-либо быстрее, чем это (на одноузловой машине)? Обратите внимание, что я использую read -r и id="$(echo $line | awk '{print $1}')", потому что у меня есть поля с разделителями полей, и в некоторых полях, которые я хочу сохранить, есть определенные символы, такие как обратные косые черты.

while read -r line 
    do 
     id="$(echo $line | awk '{print $1}')" 
     echo "$line" >> $id.txt 
    done < $1 

Некоторые характеристики моего ввода:

  • Выходные $id.txt файлы не так велико, как правило, несколько сотен строк в среднем и до нескольких тысяч строк
  • на идентификаторы фактически уже сортируют и линии входят в непрерывных блоков, то есть:
abc ... 
abc ... 
def ... 
def ... 
def ... 
def ... 
ghi ... 
ghi ... 
+0

Вы пишете каждую строку по одному; почему бы не буферизировать их и написать большой блок? –

ответ

6

Слишком много работы.

awk '{ print >> $1".txt" }' "$1" 
+0

'awk '{print >> $ 1}'" $ 1 «mybigfile.txt» генерирует ошибку: «... делает слишком много открытых файлов» после примерно 20 файлов для меня. Как мне обойти это? Мой номер файлов находится в тысячах. – williampli

+0

Я могу сделать 'awk '{print >> $ 1" .txt "; close ($ 1)} '"$ 1" 'успешно; это правильный способ сделать это? Это определенно замедляет работу. – williampli

1

Я предполагаю, что ваша медлительность приходит делать $(echo $line | awk '{print $1}' для каждой строки, что означает, что операционная система должна пройти через работу по созданию двух новых процессов для каждой строки, усугубляется awk быть переводчиком , Вы должны сконденсировать это в один скрипт, используя что-то вроде awk (само по себе) или Perl.

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