awk без печати новой строки
Я хочу, чтобы переменная sum / NR печаталась бок о бок в каждой итерации. Как избежать awk от печати новой строки на каждой итерации ? В моем коде новая строка печатается по умолчанию в каждой итерации
for file in cg_c ep_c is_c tau xhpl
printf "n $file" >> to-plot.xls
for f in 2.54 1.60 800
awk '{sum+=}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
done
done
Я хочу, чтобы вывод выглядел следующим образом
cg_c ans1 ans2 ans3
ep_c ans1 ans2 ans3
is_c ans1 ans2 ans3
tau ans1 ans2 ans3
xhpl ans1 ans2 ans3
мой текущий выход, как это
**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
5 ответов
awk '{sum+=}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
print
по умолчанию вставляет новую строку. Вы не хотите, чтобы это произошло, поэтому использовать printf
вместо.
переменная ORS (разделитель выходных записей) в AWK по умолчанию имеет значение "\n" и печатается после каждой строки. Вы можете изменить его на "" в BEGIN
раздел, если вы хотите, чтобы все печаталось последовательно.
я думаю, что многие люди входят в этот вопрос, ища способ избежать новой строки в awk
. Таким образом, я собираюсь предложить решение именно этого, поскольку ответ на конкретный контекст уже был решен!
на awk
, print
автоматически вставляет ORS
после печати. ORS
означает "разделитель выходных записей" и по умолчанию используется новая строка. Поэтому всякий раз, когда вы говорите print "hi"
awk печатает "привет" + новая строка.
это может быть изменено двумя разными способами: с помощью пустого ORS
или через printf
.
пустой ORS
awk -v ORS= '1' <<< "hello
man"
это возвращает "helloman", все вместе.
проблема здесь заключается в том, что не все неловко принимать параметр пустой ORS
, поэтому вам, вероятно, придется установить другой разделитель записей.
awk -v ORS="-" '{print ...}' file
например:
awk -v ORS="-" '1' <<< "hello
man"
возвращает"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", }'
12345$
# ^ prompt here
$ seq 5 | awk '{printf "%s", } END {print ""}'
12345
если Perl является опцией, вот решение, использующее пример fedorqui:
seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'
пояснение:chomp
удаляет символ новой строкиprint "$_ "
печатает каждую строку, добавляя пробел
the END{}
блок используется для печати новой строки
выход: 1 2 3 4 5