Символы -
означают, что файл записывается в лог-файл нормально, то есть буферизованно. Без -
файл промывается через каждую строку, поэтому в случае проблем с питанием каждая строка уже была записана на диск.
Это можно сделать в awk
с помощью функции getline()
. Команда работает путем выбора пустых строк в текстовом файле !NF
, т.е. это означает, что те строки, которые являются пустыми (, количество полей в строке равно 0 ). С помощью функции getline()
мы получаем следующую непосредственную строку из пустой строки и сохраняем в переменной nxt
.
awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file
Затем часть внутри {..}
создает строку, объединяющую переменную, встроенную новую -строку, (конкатенацию строки сORS
)и переменную обратно. Второе добавление необходимо, потому что вызов getline()
по умолчанию перемещает указатель строки на один уровень вперед. См. Как навсегда изменить файл с помощью awk? («в -месте» редактирования, как с «sed -i»)для динамического изменения файла.
$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake
или
awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file
, который дает тот же результат.
Каждая строка печатается 1 раз плюс количество раз, соответствующее количеству пустых строк над ней. Пустые строки подсчитываются в переменной r
.
Пустые строки обнаруживаются с помощью регулярного выражения ^$
, но вы также можете использовать length == 0
или NF == 0
.
Сsed
:
sed -ne '/./!{n;p;}' -e p your-file
/./! action
запускает действие (здесь извлекает n
строку ext и p
печатает ее )для строк, которые не(!
)содержат какой-либо одиночный символ(.
— это оператор регулярного выражения, который соответствует любому одиночному символу ).
Некоторые реализации sed
также имеют опцию -i
или -i ''
для редактирования файла в месте -.
Пробовал с приведенной ниже комбинацией команд sed, все работало нормально
for i in `sed -n '/^$/{n;p}' filename`; do sed -i "0,/^$/s/^$/$i/g" filename; done
выход
apple
banana
banana
big
sig
cake
cake
Вы можете сделать это следующим образом:
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp