Вот решение с cut
и paste
. Поскольку у вас нет разделителя, такого как пробел или табулятор, требуется некоторое исправление с помощьюsed
:
for COL in {1..5}; do cut -c $COL < infile | paste -s -d_ ; done | sed -e 's/__/_ /g' -e 's/_//g'
Здесь разбито на многострочное:
for COL in {1..5}; do
cut -c $COL < infile | paste -s -d_
done | sed -e 's/__/_ /g' -e 's/_//g'
Вывод первой части выглядит так:
for COL in {1..5}; do cut -c $COL < infile | paste -s -d_ ; done
a_f_k_o
b_g_l_p
c_h_m_q
d_i_n_r
e_j__s
Раздражает то, что перед запуском нужно знать, сколько столбцов имеется.
Основная проблема заключается в используемом вами сценарии. Переключение контекста очень затратно с точки зрения задержки. sleep 1
переводит ваш скрипт в спящий режим. когда таймер заканчивается, процесс снова становится работоспособным, возможно, он также перераспределяется на другое ядро вашего процессора (миграция ). Таким образом, в основном вы не опрашиваете /proc/stat
ровно каждые 1000 мс, насколько вы можете указать это в своем сообщении.
Между прочим, это не очень хороший способ оценить ядро RT.
Я действительно предлагаю вам использовать, например, sysjitter
от Solarflare sysjitter openonload , который даст вам гораздо лучшие показатели того, как работает ядро.
Основная идея состоит в том, чтобы иметь бесконечный цикл, закрепленный на одном ядре (1 работающий поток на ядро ), который объединяет счетчик отметок времени (TSC )регистр ядра и сравнивает два следующих значения чтобы увидеть разницу, которая может происходить каждый раз, когда ядро вытесняет запущенный процесс (предположительно 100 Гц ).
Таким образом, вы получите лучшее представление о системном джиттере вашего сервера и, возможно, решите немного больше его настроить.
Также вам следует обратить внимание на изоляцию процессора, чтобы иметь выделенное ядро для вашего приложения и динамическую конфигурацию ядра, если ваш вариант использования требует такого улучшения.
Редактировать :Я предлагаю вам использовать awk
только для всех ваших нужд с таким небольшим скриптом, как этот:
#!/usr/bin/awk
BEGIN {
sum1=0;
sum2=0;
result=0;
file="/proc/stat";
while (( getline < file ) > 0 ) {
if ($1=="cpu1"){ sum1=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11 };
}
close(file) ;
print "firt time " sum1;
system("sleep 10");
while (( getline < file ) > 0 ) {
if ($1=="cpu1") { sum2=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11 }
}
close (file)
print "secont time " sum2;
result=sum2-sum1;
print "sum is " result/10;
}
Эта выборка выполняется в течение 10 секунд, а результат делится на десять, чтобы получить среднее время для сегментов длительностью 1 с.