Я предполагаю, что многие люди входят в этот вопрос, ища способ избежать новой линии в awk
. Таким образом, я собираюсь предложить решение именно этого, так как ответ на конкретный контекст уже был решен!
В awk
, print
автоматически вставляет ORS
после печати. ORS
расшифровывается как «разделитель выходных записей» и по умолчанию соответствует новой строке. Поэтому всякий раз, когда вы говорите, print "hi"
awk печатает «привет» + новая строка.
Это может быть изменено двумя различными способами: используя пустой ORS
или используя printf
.
Используя пустой ORS
awk -v ORS= '1' <<< "hello
man"
Это возвращает "helloman", все вместе.
Проблема здесь заключается в том, что не все awk допускают установку пустого значения ORS
, поэтому вам, вероятно, придется установить другой разделитель записей.
awk -v ORS="-" '{print ...}' file
Например:
awk -v ORS="-" '1' <<< "hello
man"
Возвращает "привет-человек".
Использование printf
(предпочтительно)
Пока print
прикрепляет ORS
после записи, printf
нет. Таким образом, printf "hello"
просто печатает «привет», больше ничего.
$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye
Наконец, обратите внимание, что в общем случае пропускается последняя новая строка, поэтому приглашение оболочки будет в той же строке, что и последняя строка вывода. Чтобы очистить это, используйте, END {print ""}
чтобы новая строка была напечатана после всей обработки.
$ seq 5 | awk '{printf "%s", $0}'
12345$
# ^ prompt here
$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
printf
трактует%s
так использоватьprintf "%s" whatever
вместоprintf whatever
.