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

person Sharat Chandra    schedule 07.01.2010    source источник


Ответы (6)


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

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

person CodeRain    schedule 07.01.2010
comment
Но учтите, что printf интерпретирует %s, поэтому используйте printf "%s" whatever вместо printf whatever. - person Matthieu; 11.02.2018
comment
printf "%s",whatever Вы забыли запятую. Вы также можете добавить больше переменных и разделить их запятыми. - person Hielke Walinga; 07.08.2018

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

person danben    schedule 07.01.2010
comment
Возможно, вы даже захотите установить "" (без пробела), чтобы вообще не было разделения. - person mschilli; 08.08.2013
comment
Как это: awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls - person Fredrik Erlandsson; 19.09.2013
comment
Или ORS="\r", если хотите, например чтобы напечатать счетчик, показывающий прогресс. - person Skippy le Grand Gourou; 07.03.2014

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

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

Это можно изменить двумя способами: с помощью пустого ORS или с помощью printf.

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

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

Это возвращает "хелломана", все вместе.

Проблема здесь в том, что не все 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
person fedorqui 'SO stop harming'    schedule 09.04.2015

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

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
person ghostdog74    schedule 07.01.2010
comment
Незначительное примечание: никогда не используйте printf $0, поскольку $0 может содержать такие строки, как %F и т. Д. ... Следующее легко терпит неудачу (по крайней мере, с GAWK 3.1.5): echo "%F"|awk '{printf $0}'. Вместо этого используйте printf "%s",$0. - person Vlad; 21.12.2016

Вы можете просто динамически использовать ORS следующим образом:

awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out

person Andrea Barletta    schedule 14.03.2019

Если Perl - вариант, вот решение на примере Fedorqui:

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

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

вывод: 1 2 3 4 5

person Chris Koknat    schedule 27.10.2016