2014-01-21 3 views
0

Хотя чтение строки происходит очень медленно, когда вы работаете с большими файлами. Общее предложение, которое я нашел из google, - использовать awk, но как я могу преобразовать следующие while в awk?Преобразование во время чтения строки в awk

 while read r; do 
      html[$dId]+=$(echo -e "\n$r") 
      stopList $(echo -e "$r" | tr -d ' ') all 
     done <<< "$list" 

что я пытался

 awk '{ 
      html[$dId]+=$(echo -e "\n$0") 
      stopList $(echo -e "$0" | tr -d ' ') all 
     }' <<< "$list" 
+0

некоторые данные ввода, а также ожидаемый результат были бы хорошими –

+0

что такое stopList? – stark

+0

это функция bash. он довольно большой, поэтому, чтобы не путать, я не включил его. – Orlo

ответ

2

Причина это медленно, потому что он работает несколько процессов за итерацию:

while read r; do 
    html[$dId]+=$(echo -e "\n$r") 
    stopList $(echo -e "$r" | tr -d ' ') all 
done <<< "$list" 

Есть: 2 вторит, А tr, и stopList функция, которую мы даже не знаем, что она делает.

Чтобы преобразовать это awk вам нужно пересмотреть немного, что-то вроде этого:

html[$dId]=$(awk '{ printf("\n%s", $0) }' <<< "$list") 

То есть, вместо того, чтобы добавить его к html построчно, awk должна создавать все это. Внутри одного процесса awk вы можете сделать очень мощную обработку текста, которая будет намного эффективнее, чем несколько echo s, tr и такие и такие в оболочке.

Мой пример не включает stopList, потому что вы не объяснили, что он делает. Независимо от того, что он делает, вам необходимо реализовать его в пределах awk, чтобы он мог работать в рамках одного и того же процесса awk. Тогда ваш скрипт будет намного быстрее, чем текущий цикл строк while.

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