Я думаю, что отчасти проблема в том, что каждая строка включает выполнение команд echo
и cut
:
name=`echo "$line" | cut -d" " -f2`
(По крайней мере, я думаю, что echo
вызвал команду /bin/echo
вместо встроенной оболочки echo
. Я знаю cut
есть внешняя программа.)
Кроме того, файлы назначения повторно открываются и закрываются (и записываются без использования стандартной буферизации ввода-вывода C, если только эти строки не равны огромные ) для каждой отдельной строки.
Переключение на другой язык, позволяющий вам выполнять эти операции без fork(2)
, execve(2)
, open(2)
, write(2)
и close(2)
для каждой отдельной строки, было бы улучшением. Вот мой снимок в Ruby:
$ cat split.rb
#!/usr/bin/ruby
output = nil
File.open("input.txt").each { |line|
if (line.match(/Rate: (.+)$/)):
output = File.new("tmp/#{$1}", "a")
end
output.write(line)
}
$
Я проверил это на игрушечном вводе, который вы дали, похоже, все правильно.