awk tanpa mencetak baris baru

169

Saya ingin jumlah variabel / NR akan dicetak berdampingan di setiap iterasi. Bagaimana kita menghindari awk dari mencetak baris baru di setiap iterasi? Dalam kode saya, baris baru dicetak secara default di setiap iterasi

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

Saya ingin output muncul seperti ini

cg_c ans1  ans2  ans3  
ep_c ans1  ans2  ans3 
is_c ans1  ans2  ans3
tau  ans1  ans2  ans3 
xhpl ans1  ans2  ans3

put out saya saat ini adalah seperti ini

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
Sharat Chandra
sumber

Jawaban:

220

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

printakan menyisipkan baris baru secara default. Anda tidak ingin itu terjadi, maka gunakan printfsaja.

Hujan Code
sumber
4
Tetapi pikiran bahwa printfpenafsiran %sjadi gunakan printf "%s" whateverbukan printf whatever.
Matthieu
1
printf "%s",whateverAnda lupa koma. Anda juga dapat memperluas dengan lebih banyak variabel dan memisahkannya dengan koma.
Hielke Walinga
74

Variabel ORS (output record separator) dalam AWK default ke "\ n" dan dicetak setelah setiap baris. Anda dapat mengubahnya menjadi "" di BEGINbagian ini jika Anda ingin semuanya dicetak secara berurutan.

danben
sumber
6
Anda bahkan mungkin ingin mengaturnya ""(tanpa spasi) untuk tidak memiliki pemisahan sama sekali.
mschilli
8
Seperti ini:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
Fredrik Erlandsson
2
Atau ORS="\r"jika Anda ingin misalnya mencetak penghitung yang menunjukkan progres.
Skippy le Grand Gourou
47

Saya kira banyak orang yang masuk dalam pertanyaan ini mencari cara untuk menghindari baris baru di awk. Jadi, saya akan menawarkan solusi untuk itu, karena jawaban untuk konteks spesifik sudah dipecahkan!

Dalam awk, printsecara otomatis memasukkan ORSsetelah pencetakan. ORSsingkatan dari "output record separator" dan default ke baris baru. Jadi, setiap kali Anda mengatakan print "hi"awk mencetak "hai" + baris baru.

Ini dapat diubah dengan dua cara berbeda: menggunakan yang kosong ORSatau menggunakan printf.

Menggunakan yang kosong ORS

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

Ini mengembalikan "helloman", semuanya.

Masalahnya di sini adalah tidak semua awks menerima pengaturan kosong ORS, jadi Anda mungkin harus mengatur pemisah rekaman lain.

awk -v ORS="-" '{print ...}' file

Sebagai contoh:

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

Mengembalikan "hello-man-".

Menggunakan printf(lebih disukai)

Saat printmenempel ORSsetelah catatan, printftidak. Jadi, printf "hello"cetak saja "halo", tidak ada yang lain.

$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye

Akhirnya, perhatikan bahwa secara umum ini melewatkan baris baru akhir, sehingga prompt shell akan berada di baris yang sama dengan baris terakhir dari output. Untuk membersihkan ini, gunakan END {print ""}sehingga baris baru akan dicetak setelah semua pemrosesan.

$ seq 5 | awk '{printf "%s", $0}'
12345$
#    ^ prompt here

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
fedorqui 'SO berhenti merugikan'
sumber
5

satu arah

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
ghostdog74
sumber
1
Minor catatan: tidak pernah menggunakan printf $0, karena $0mungkin mengandung string seperti %F, dll ... Setelah dengan mudah gagal (setidaknya dengan melongo 3.1.5): echo "%F"|awk '{printf $0}'. Gunakan printf "%s",$0saja.
Vlad
2

Anda cukup menggunakan ORS secara dinamis seperti ini:

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

Andrea Barletta
sumber
1

Jika Perl adalah opsi, berikut adalah solusi menggunakan contoh fedorqui:

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

Penjelasan:
chompmenghapus baris baru
print "$_ "mencetak setiap baris, menambahkan ruang
yang END{}blok digunakan untuk mencetak baris baru

keluaran: 1 2 3 4 5

Chris Koknat
sumber