awk без печати новой строки

169

Я хочу, чтобы переменная сумма / 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
Шарат Чандра
источник

Ответы:

220

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

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

CodeRain
источник
4
Но ум , который printfтрактует %sтак использовать printf "%s" whateverвместо printf whatever.
Матье
1
printf "%s",whateverВы забыли запятую. Вы также можете расширить дополнительные переменные и разделить их запятой.
Хильке Валинга,
74

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

danben
источник
6
Вы могли бы даже хотеть установить это ""(без места), чтобы не иметь никакого разделения вообще.
mschilli
8
Как это:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
Фредрик Эрландссон
2
Или, ORS="\r"если вы хотите напечатать счетчик, показывающий прогресс.
Скиппи ле Гран Гуру
47

Я предполагаю, что многие люди входят в этот вопрос, ища способ избежать новой линии в 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
Федорки "ТАК прекратить вредить"
источник
5

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

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
ghostdog74
источник
1
Незначительное примечание: никогда не использовать printf $0, так как $0может содержать строки , как %Fи т.д ... После легко выходит из строя (по крайней мере с поглазеть 3.1.5): echo "%F"|awk '{printf $0}'. Используйте printf "%s",$0вместо этого.
Влад
2

Вы можете просто использовать ORS динамически, как это:

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

Андреа Барлетта
источник
1

Если Perl является опцией, вот решение на примере Федорки:

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

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

вывод: 1 2 3 4 5

Крис Кокнат
источник