Awk без печати новой строки - программирование

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+=$3}; 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
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

В awk, print автоматически вставляет ORS после печати. ORS означает "разделитель выходной записи" и по умолчанию используется новая строка. Поэтому всякий раз, когда вы говорите print "hi" awk печатает "привет" + новую строку.

Это можно изменить двумя разными способами: используя пустой ORS или используя printf.

Используя пустой ORS

awk -v ORS= '1' <<< "hello
man"

Это возвращает "helloman", все вместе.

Проблема заключается в том, что не все awks принимают установку пустого 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", $0}'
12345$
#    ^ prompt here

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345

Ответ 4

в одну сторону

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

Ответ 5

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

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

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

вывод: 1 2 3 4 5