Как удалить пустые строки в конце файла с помощью awk?

Вы не упомянули, поэтому я предполагаю, что вы спрашиваете конкретно о 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, хотя это отличается от clockAPI. Во-первых, вам явно нужно вызвать clock_gettimeв начале и сохранить результат, используя его для сравнения (, хотя вы можете уже сделать это, в зависимости от того, как вы используетеclock). Вы также должны согласиться с тем, что это time_tвместо clock_t, хотя вы можете вернуться, используя CLK_TCK.
2
27.08.2021, 17:51
3 ответа

Этот подход с 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на /./.

6
27.08.2021, 19:34
co=`awk '!/^$/{x=NR}END{print x}' filename`
co=$(($co+1))
j="$co,$"
sed -i "${j}d" filename

Проверено, работает нормально

1
27.08.2021, 19:43

Использование 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
3
27.08.2021, 23:37

Теги

Похожие вопросы