Yeni satır yazdırmadan awk


169

Değişken toplamı / NR'nin her yinelemede yan yana yazdırılmasını istiyorum. Awk'nin her yinelemede satırsonu yazdırmasını nasıl önleyebiliriz? Kodumda her yinelemede varsayılan olarak bir yeni satır yazdırılır

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

Çıktının böyle görünmesini istiyorum

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

şu anki çıkışım böyle

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

Yanıtlar:


220

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

printvarsayılan olarak bir satırsonu ekleyecektir. Bunun olmasını istemezsiniz, printfbunun yerine kullanın.


4
Ama printfyorumlayan akıl yerine %skullanmak . printf "%s" whateverprintf whatever
Matthieu

1
printf "%s",whateverVirgül unuttun. Ayrıca daha fazla değişkenle genişletebilir ve virgülle ayırabilirsiniz.
Hielke Walinga

74

AWK'daki ORS (çıkış kayıt ayırıcı) değişkeni varsayılan olarak "\ n" olur ve her satırdan sonra yazdırılır. Her BEGINşeyin art arda yazdırılmasını istiyorsanız bölümden "" olarak değiştirebilirsiniz .


6
Hatta ""hiç boşluk bırakmayacak şekilde (boşluk yok) ayarlamak isteyebilirsiniz .
mschilli

8
awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
Şunun

2
Veya ORS="\r"örneğin ilerleme gösteren bir sayaç yazdırmak istiyorsanız.
Skippy le Grand Gourou

47

Sanırım birçok insan bu soruya girerek yeni çizgiden kaçınmanın bir yolunu arıyor awk. Böylece, belirli bir bağlamın cevabı zaten çözülmüş olduğundan, bunun için bir çözüm sunacağım!

Içinde awk, printotomatik olarak bir ORSbaskı sonrası ekler . ORS"çıkış kayıt ayırıcısı" anlamına gelir ve varsayılan olarak yeni satırı kullanır. Yani her ne zaman print "hi"awk "hi" + yeni satır yazdırır.

Bu iki farklı şekilde değiştirilebilir: boş bir ORSkullanma veya kullanma printf.

Boş kullanma ORS

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

Bu hep birlikte "merhaba" döndürür.

Buradaki sorun, tüm awks'lerin boş ayar yapmayı kabul etmemesidir ORS, bu nedenle muhtemelen başka bir kayıt ayırıcı ayarlamanız gerekir.

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

Örneğin:

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

"Merhaba-man-" döndürür.

Kullanma printf(tercih edilir)

İken printAtaşe ORSkayıt sonra, printfyapmaz. Böylece, printf "hello"sadece "merhaba" yazdırır, başka bir şey.

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

Son olarak, kabuk isteminin çıktının son satırıyla aynı satırda olmasını sağlamak için genel olarak son bir yeni satırı kaçırdığını unutmayın. Bunu temizlemek için, END {print ""}tüm işlemlerden sonra yeni bir satır yazdırılacak şekilde kullanın .

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

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345

5

tek yön

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls

1
Minör not: asla kullanma printf $0beri $0gibi dizeleri içerebilir %F, vb ... kolayca takip (GAWK ile en az 3.1.5) başarısız: echo "%F"|awk '{printf $0}'. Kullanım printf "%s",$0yerine.
Vlad

2

ORS'yi aşağıdaki gibi dinamik olarak kullanabilirsiniz:

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


1

Perl bir seçenekse, fedorqui örneği kullanan bir çözüm:

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

Açıklama: her satıra
chompyeni satır
print "$_ "yazdırır , yeni satır yazdırmak
için END{}blok kullanılan bir boşluk ekler

çıktı: 1 2 3 4 5

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.