Я хочу, чтобы переменная сумма / 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
printf
трактует%s
так использоватьprintf "%s" whatever
вместоprintf whatever
.printf "%s",whatever
Вы забыли запятую. Вы также можете расширить дополнительные переменные и разделить их запятой.Переменная ORS (разделитель выходных записей) в AWK по умолчанию имеет значение "\ n" и печатается после каждой строки. Вы можете изменить его на «» в
BEGIN
разделе, если хотите, чтобы все печаталось последовательно.источник
""
(без места), чтобы не иметь никакого разделения вообще.awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
ORS="\r"
если вы хотите напечатать счетчик, показывающий прогресс.Я предполагаю, что многие люди входят в этот вопрос, ища способ избежать новой линии в
awk
. Таким образом, я собираюсь предложить решение именно этого, так как ответ на конкретный контекст уже был решен!В
awk
,print
автоматически вставляетORS
после печати.ORS
расшифровывается как «разделитель выходных записей» и по умолчанию соответствует новой строке. Поэтому всякий раз, когда вы говорите,print "hi"
awk печатает «привет» + новая строка.Это может быть изменено двумя различными способами: используя пустой
ORS
или используяprintf
.Используя пустой
ORS
Это возвращает "helloman", все вместе.
Проблема здесь заключается в том, что не все awk допускают установку пустого значения
ORS
, поэтому вам, вероятно, придется установить другой разделитель записей.Например:
Возвращает "привет-человек".
Использование
printf
(предпочтительно)Пока
print
прикрепляетORS
после записи,printf
нет. Таким образом,printf "hello"
просто печатает «привет», больше ничего.Наконец, обратите внимание, что в общем случае пропускается последняя новая строка, поэтому приглашение оболочки будет в той же строке, что и последняя строка вывода. Чтобы очистить это, используйте,
END {print ""}
чтобы новая строка была напечатана после всей обработки.источник
в одну сторону
источник
printf $0
, так как$0
может содержать строки , как%F
и т.д ... После легко выходит из строя (по крайней мере с поглазеть 3.1.5):echo "%F"|awk '{printf $0}'
. Используйтеprintf "%s",$0
вместо этого.Вы можете просто использовать ORS динамически, как это:
awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out
источник
Если Perl является опцией, вот решение на примере Федорки:
seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'
Объяснение:
chomp
удаляет новуюprint "$_ "
строку, печатает каждую строку, добавляя пробел,используемый
END{}
блоком для печати новой строки.вывод:
1 2 3 4 5
источник