>awk и перебор в цикле делать умею, но это медленно. А я сумел сделать на sed-е и это медленнее, чем на awk-е (сравнивал с реализацией vlc из реплики #6)
Итак. Входные данные - два "тестовых набора" (первый - попроще, второй - сильно вложенный) с разным количеством строк. Тестируемые скрипты (четыре)- мой на sed (без расширения; запускался под GNU sed) и .awk от vlc, запускаемый под gawk "как awk", под gawk "как gawk" и под nawk.
Вывод: awk не медленнее sed-а. Проверявшаяся реализация скрипта и на проверявшихся реализациях интерпретаторов -- по крайней мере.
ПРИЛОЖЕНИЕ 1, прОтокол.
$ cat ./BM.sh
#!/bin/bash
data0() { yes start|head -$1 ;echo message; yes end|head -$1; }
data201() { for(( i=$1; i>0; i-=201)); do data0 $((i>201?100:i/2)); done; }
dataMAX() { yes start|head -$(($1/2)) ;echo message; yes end|head -$(($1/2)); }
BM() { echo "$3 `$2 $3 | time ./$1 2>&1 >/dev/null \
|awk '/elapsed/{print $1" "$4((gensub(/:/,"",1,$3)+0>3)?" "$3:"")}' `"; }
for scr in indent indent.awk indent.gawk indent.nawk; do
echo "*** $scr, data201"
for n in 1 10 100 1000 `seq 10000 10000 100000`; do
BM $scr "data201" $n
done
echo "*** $scr, dataMAX"
for n in 1 10 100 `seq 1000 1000 10000`; do
BM $scr "dataMAX" $n
done
done
$ ./BM.sh
*** indent, data201
1 0.00user 0%CPU
10 0.00user 0%CPU
100 0.00user 17%CPU
1000 0.04user 32%CPU
10000 0.54user 43%CPU
20000 1.04user 43%CPU
30000 1.78user 49%CPU
40000 2.20user 46%CPU 0:04.81elapsed
50000 2.82user 45%CPU 0:06.22elapsed
60000 3.18user 31%CPU 0:10.03elapsed
70000 3.69user 43%CPU 0:08.43elapsed
80000 4.42user 43%CPU 0:10.23elapsed
90000 4.78user 32%CPU 0:14.65elapsed
100000 5.70user 31%CPU 0:17.96elapsed
*** indent, dataMAX
1 0.00user 0%CPU
10 0.00user 0%CPU
100 0.00user 28%CPU
1000 0.26user 70%CPU
2000 0.92user 92%CPU
3000 2.06user 64%CPU
4000 3.88user 69%CPU 0:05.58elapsed
5000 6.30user 96%CPU 0:06.55elapsed
6000 8.04user 77%CPU 0:10.37elapsed
7000 12.66user 87%CPU 0:14.44elapsed
8000 14.28user 95%CPU 0:14.92elapsed
9000 19.65user 91%CPU 0:21.48elapsed
10000 22.93user 95%CPU 0:23.96elapsed
*** indent.awk, data201
1 0.00user 0%CPU
10 0.00user 0%CPU
100 0.00user 36%CPU
1000 0.00user 3%CPU
10000 0.03user 4%CPU
20000 0.07user 5%CPU
30000 0.07user 4%CPU
40000 0.12user 5%CPU
50000 0.18user 5%CPU
60000 0.20user 4%CPU 0:04.06elapsed
70000 0.30user 5%CPU 0:05.41elapsed
80000 0.29user 5%CPU 0:05.57elapsed
90000 0.29user 4%CPU 0:07.14elapsed
100000 0.36user 5%CPU 0:07.36elapsed
*** indent.awk, dataMAX
1 0.00user 61%CPU
10 0.00user 0%CPU
100 0.00user 28%CPU
1000 0.00user 25%CPU
2000 0.00user 16%CPU
3000 0.01user 51%CPU
4000 0.02user 77%CPU
5000 0.03user 91%CPU
6000 0.03user 63%CPU
7000 0.04user 70%CPU
8000 0.06user 81%CPU
9000 0.07user 85%CPU
10000 0.08user 89%CPU
*** indent.gawk, data201
1 0.00user 0%CPU
10 0.00user 0%CPU
100 0.00user 0%CPU
1000 0.00user 11%CPU
10000 0.04user 7%CPU
20000 0.09user 7%CPU
30000 0.12user 6%CPU
40000 0.13user 5%CPU
50000 0.15user 4%CPU
60000 0.19user 4%CPU 0:05.02elapsed
70000 0.19user 3%CPU 0:06.39elapsed
80000 0.26user 4%CPU 0:06.33elapsed
90000 0.27user 3%CPU 0:07.65elapsed
100000 0.35user 4%CPU 0:07.96elapsed
*** indent.gawk, dataMAX
1 0.00user 0%CPU
10 0.00user 21%CPU
100 0.00user 0%CPU
1000 0.00user 16%CPU
2000 0.00user 30%CPU
3000 0.01user 47%CPU
4000 0.03user 68%CPU
5000 0.03user 81%CPU
6000 0.04user 77%CPU
7000 0.06user 86%CPU
8000 0.06user 39%CPU
9000 0.08user 52%CPU
10000 0.10user 42%CPU
*** indent.nawk, data201
1 0.00user 9%CPU
10 0.00user 26%CPU
100 0.00user 25%CPU
1000 0.00user 2%CPU
10000 0.03user 3%CPU
20000 0.05user 2%CPU
30000 0.11user 2%CPU
40000 0.10user 3%CPU 0:04.17elapsed
50000 0.18user 5%CPU
60000 0.19user 4%CPU 0:04.98elapsed
70000 0.20user 3%CPU 0:05.80elapsed
80000 0.28user 4%CPU 0:06.26elapsed
90000 0.26user 3%CPU 0:07.40elapsed
100000 0.33user 4%CPU 0:08.11elapsed
*** indent.nawk, dataMAX
1 0.00user 0%CPU
10 0.00user 0%CPU
100 0.00user 0%CPU
1000 0.00user 27%CPU
2000 0.01user 48%CPU
3000 0.01user 48%CPU
4000 0.02user 47%CPU
5000 0.03user 70%CPU
6000 0.04user 75%CPU
7000 0.04user 68%CPU
8000 0.04user 64%CPU
9000 0.08user 97%CPU
10000 0.09user 86%CPU
$ exit