awk без друку нового рядка


169

Я хочу, щоб змінна сума / NR була надрукована поруч у кожній ітерації. Як ми уникаємо друку нових рядків у кожній ітерації? У моєму коді новий рядок друкується за замовчуванням у кожній ітерації

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

Відповіді:


219

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

printбуде вставлено новий рядок за замовчуванням. Ви не хочете, щоб це сталося, тому використовуйте printfзамість цього.


4
Але розум , який printfтрактує %sтак використовувати printf "%s" whateverзамість printf whatever.
Матьє

1
printf "%s",whateverВи забули кому. Ви також можете розширити більше змінних і розділити їх комою.
Hielke Walinga

74

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


6
Ви навіть можете встановити його ""(немає місця), щоб не було розлуки взагалі.
mschilli

8
Ось так:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
Фредрік Ерландссон

2
Або ORS="\r"якщо ви хочете, наприклад, надрукувати лічильник із зазначенням прогресії.
Skippy le Grand Gourou

47

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

В awk, printавтоматично вставляє ORSпісля друку. ORSозначає "роздільник вихідних записів" і за замовчуванням новий рядок. Тому щоразу, коли ви кажете print "hi"awk, друкує "привіт" + новий рядок.

Це можна змінити двома різними способами: за допомогою порожнього ORSабо використання printf.

Використання порожнього ORS

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

Це повертається "привіт", всі разом.

Проблема тут полягає в тому, що не всі дивовижі приймають налаштування порожнього 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

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 є варіантом, ось рішення за допомогою прикладу fedorqui:

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

Пояснення:
chompвидаляє символ нового рядка
print "$_ "друкує кожен рядок додаванням пробілу блок використовується для друку нового рядка
END{}

вихід: 1 2 3 4 5

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.