Вы не упомянули, поэтому я предполагаю, что вы спрашиваете конкретно о Linux.
Изman 3 clock
:
The value returned is the CPU time used so far as a clock_t; to get the number of seconds used, divide by CLOCKS_PER_SEC.
То есть часы относятся только к процессорному времени. Если вы хотите провести время на стене, вы можете:
/proc/.../stat
с чем-то эквивалентным awk -v RS=\) '{ print $20 }' /proc/.../stat
, которое содержит время начала процесса в тактах с момента загрузки. Затем вы можете сравнить текущее время безотказной работы с sysinfo()
, чтобы определить, сколько времени прошло с момента запуска процесса (, хотя, что раздражает, вам нужно затем преобразовать время безотказной работы в часы, разделив его наCLK_TCK
). Или, clock_gettime
с CLOCK_MONOTONIC
, хотя это отличается от clock
API. Во-первых, вам явно нужно вызвать clock_gettime
в начале и сохранить результат, используя его для сравнения (, хотя вы можете уже сделать это, в зависимости от того, как вы используетеclock
). Вы также должны согласиться с тем, что это time_t
вместо clock_t
, хотя вы можете вернуться, используя CLK_TCK
. Этот подход с 1 -проходом будет работать независимо от того, поступает ли ввод из канала или из файла, но должен хранить каждый блок пустых строк в памяти (, что, вероятно, не будет проблемой, если у вас нет миллиардов смежных пустых строк в вашем вводе):
awk 'NF{print s $0; s=""; next} {s=s ORS}' file
Этот двухпроходный подход -не будет работать, если входные данные являются каналом, но будут работать, если входные данные представляют собой файл, как вы сказали в вопросе, и почти не используют память:
awk 'NR==FNR{if (NF) n=NR; next} FNR>n{exit} 1' file file
Вышеизложенное предполагает, что строка, содержащая только пробелы, считается «пустой». Если это не так, измените NF
на /./
.
co=`awk '!/^$/{x=NR}END{print x}' filename`
co=$(($co+1))
j="$co,$"
sed -i "${j}d" filename
Проверено, работает нормально
Использование awk
и его оператора диапазона,
awk '
!NF,NF{
t = ($0 = t $0) ORS
if (!NF) next
t=""
}1' file
Мы накапливаем пустые строки + одну непустую строку в t. Если видно непустое, сбрасываем буфер t и перезапускаем процесс накопления.
Со всеми -конструкциями POSIX мы можем сделать это с помощью утилиты sed, как показано:
sed -e '
/^\n*$/!b
$d;N;s/./&&/;D
' file