2015-10-28 1 views
1

У меня есть следующий Баш код с помощью поглазеть GSUB:Подсчитать количество замен GNU AWK gensub

replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" '{ num += gsub(OLD, NEW); print $0 > FILE_TMP; } END { print num }' "$FILE") 

Он заменяет все экземпляры только новыми и выводит результаты в FILE_TMP - количество замен ловится в переменной bash.

Можно ли достичь тех же результатов, используя gawk gensub?

  1. $ FILE - 182 строки длиной.
  2. Есть 8 вхождения $ OLD, которые должны быть заменены на $ NEW

Я пытался несколько способов, в большинстве случаев результаты равны 182, как я предполагаю, что подсчет числа вхождений $ 0.

Ближайший я получил это:

replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" '{ num[$0=gensub(OLD, NEW, "G")]++; print $0 > FILE_TMP; } END { for (i in num) print num[i] }' "$FILE") 

Что делает вывод FILE_TMP правильно. Однако replacedCount является:

replacedCount='8 
1 
1 
1 
1 
1 
1 
8 
1 
8 
8 
1 
1 
1 
8 
1 
1 
1 
1 
1 
1 
1 
1 
8 
8 
1 
1 
1 
8 
1 
1 
8 
1 
1 
1 
1 
1 
1 
1 
1 
8 
8 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
8 
1 
8 
1 
1 
1 
8 
1 
1 
8 
8 
1' 
+1

Учитывая, что' gensub' не возвращает эту информацию, я не вижу, как вы могли бы без подсчета совпадений каким-либо другим способом. –

+0

Я не понимаю, почему вы хотите 'gsub()' поведение в 'gensub()', если он отлично работает с первым:) – fedorqui

+2

расскажите нам, почему вы должны использовать 'gensub()' что еще вы хотите достичь ? Он пахнет проблемой X, Y – Kent

ответ

0

Следующие матчи на $ стара, как ворота к выполнению gensub и приращение «Num» счетчик:

replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; $0 ~ OLD { $0=gensub(OLD,NEW,"G"); num++ }; { print > FILE_TMP }; END { print num }' "$FILE") 

Если счетчик для каждого матча разыскивается (множественный в пределах прямой), нам нужно будет потерять флаг «G» в gensub() и поместить инкремент и gensub() в цикл while.

replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; { while ($0 ~ OLD) { $0=gensub(OLD,NEW,1); num++ } }; { print > FILE_TMP }; END { print num }' "$FILE") 

gensub(), прежде всего, для упрощения задачи замены «Nth» матч или не прикасаясь к оригиналу. В этой задаче, представляется вполне разумным и естественным изменить $ 0, и это более сжато и ясно использовать GSUB() и к югу(), как показано ниже:

replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; $0 ~ OLD { gsub(OLD,NEW); num++ }; { print > FILE_TMP }; END { print num }' "$FILE") 

... или «инкремент каждый матч "версия ...

replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; { while ($0 ~ OLD) { sub(OLD,NEW); num++ } }; { print > FILE_TMP }; END { print num }' "$FILE") 
+0

Пожалуйста, не отправляйте ответы только на код. Добавьте объяснение, пожалуйста. –

+0

Спасибо вам большое! (Извините за задержку, лучше поздно, чем никогда!) – Turtle