Ich möchte, dass die Variable sum / NR in jeder Iteration nebeneinander gedruckt wird. Wie vermeiden wir, dass awk in jeder Iteration Zeilenumbrüche druckt? In meinem Code wird standardmäßig in jeder Iteration eine neue Zeile gedruckt
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
Ich möchte, dass die Ausgabe so aussieht
cg_c ans1 ans2 ans3
ep_c ans1 ans2 ans3
is_c ans1 ans2 ans3
tau ans1 ans2 ans3
xhpl ans1 ans2 ans3
Mein aktueller Output ist so
**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
printf
Interpretationen%s
so verwendenprintf "%s" whatever
stattprintf whatever
.printf "%s",whatever
Du hast das Komma vergessen. Sie können auch um weitere Variablen erweitern und diese durch ein Komma trennen.Die Variable ORS (Output Record Separator) in AWK ist standardmäßig "\ n" und wird nach jeder Zeile gedruckt. Sie können es im
BEGIN
Abschnitt in "" ändern, wenn Sie möchten, dass alles nacheinander gedruckt wird.quelle
""
(kein Leerzeichen), dass es überhaupt keine Trennung gibt.awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
ORS="\r"
wenn Sie zB einen Zähler drucken möchten, der den Fortschritt anzeigt.Ich denke, viele Leute gehen in diese Frage ein und suchen nach einer Möglichkeit, die neue Zeile zu vermeiden
awk
. Daher werde ich genau dafür eine Lösung anbieten, da die Antwort auf den spezifischen Kontext bereits gelöst wurde!In
awk
,print
fügt automatisch eineORS
nach dem Drucken.ORS
steht für "Ausgabedatensatztrennzeichen" und verwendet standardmäßig die neue Zeile. Wenn Sie also sagen, dassprint "hi"
awk "hi" + neue Zeile druckt.Dies kann auf zwei verschiedene Arten geändert werden: mit einem leeren
ORS
oder mitprintf
.Mit einem leeren
ORS
Dies gibt insgesamt "helloman" zurück.
Das Problem hierbei ist, dass nicht alle awks das Setzen eines Leerzeichens akzeptieren
ORS
, sodass Sie wahrscheinlich ein anderes Datensatztrennzeichen setzen müssen.Beispielsweise:
Gibt "Hallo-Mann-" zurück.
Verwenden
printf
(vorzuziehen)Während
print
AttachesORS
nach der Aufzeichnungprintf
nicht. Alsoprintf "hello"
druckt nur "Hallo", sonst nichts.Beachten Sie schließlich, dass im Allgemeinen eine letzte neue Zeile fehlt, sodass sich die Shell-Eingabeaufforderung in derselben Zeile wie die letzte Zeile der Ausgabe befindet. Verwenden Sie zum Reinigen
END {print ""}
eine neue Zeile, die nach der gesamten Verarbeitung gedruckt wird.quelle
Einweg
quelle
printf $0
, da dies$0
Zeichenfolgen wie%F
usw. enthalten kann. Folgendes kann leicht fehlschlagen (zumindest mit GAWK 3.1.5) :echo "%F"|awk '{printf $0}'
. Verwenden Sieprintf "%s",$0
stattdessen die.Sie können ORS einfach so dynamisch verwenden:
awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out
quelle
Wenn Perl eine Option ist, finden Sie hier eine Lösung am Beispiel von fedorqui:
seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'
Erläuterung:
chomp
Entfernt die neueprint "$_ "
Zeile, die jede Zeile druckt, und fügt ein Leerzeichen hinzu, mit demder
END{}
Block eine neue Zeile drucktAusgabe:
1 2 3 4 5
quelle