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 137

5 ответов:

awk '{sum+=}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls

print будет вставлена новая строка по умолчанию. Вы не хотите, чтобы это произошло, поэтому использовать printf вместо.

переменная ORS (output record separator) в AWK по умолчанию имеет значение "\n" и печатается после каждой строки. Вы можете изменить его на "" в BEGIN раздел, если вы хотите, чтобы все печаталось последовательно.

я думаю, что многие люди входят в этот вопрос, ища способ избежать новой строки в awk. Таким образом, я собираюсь предложить решение именно этого, так как ответ на конкретный контекст уже был решен!

на awk,print автоматически вставляет a 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

один из способов

awk '/^\*\*/{gsub("*","");printf "\n"" ";next}{printf " "}' to-plot.xls

если Perl является опцией, вот решение с использованием примера fedorqui:

seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'

пояснение:
chomp удаляет символ новой строки
print "$_ " печатает каждую строку, добавляя пробел
элемент END{} блок используется для печати новой строки

выход: 1 2 3 4 5