Je veux que la variable somme/NR soit imprimée côte à côte à chaque itération. Comment pouvons-nous éviter l'awk de l'impression d'une nouvelle ligne à chaque itération? Dans mon code, une nouvelle ligne est imprimée par défaut à chaque itération
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
Je veux que la sortie apparaisse comme ceci
cg_c ans1 ans2 ans3
ep_c ans1 ans2 ans3
is_c ans1 ans2 ans3
tau ans1 ans2 ans3
xhpl ans1 ans2 ans3
ma sortie actuelle est comme ça
**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
print
insérera une nouvelle ligne par défaut. Vous ne voulez pas que cela se produise, utilisez donc printf
à la place.
La variable ORS (séparateur d’enregistrement de sortie) dans AWK est définie par défaut sur "\ n" et est imprimée après chaque ligne. Vous pouvez le remplacer par "" dans la section BEGIN
si vous souhaitez tout imprimer les uns après les autres.
Je suppose que beaucoup de gens entrent dans cette question à la recherche d'un moyen d'éviter la nouvelle ligne dans awk
. Ainsi, je vais proposer une solution à cela, car la réponse au contexte spécifique était déjà résolue!
Dans awk
, print
insère automatiquement un ORS
après l'impression. ORS
signifie "séparateur d'enregistrement en sortie" et correspond par défaut à la nouvelle ligne. Donc chaque fois que vous dites print "hi"
awk affiche "hi" + nouvelle ligne.
Cela peut être modifié de deux manières différentes: en utilisant un ORS
vide ou en utilisant printf
.
ORS
videawk -v ORS= '1' <<< "hello
man"
Cela renvoie "helloman", tous ensemble.
Le problème ici est que tous les awks n'acceptent pas de définir un ORS
vide, vous devez donc probablement définir un autre séparateur d'enregistrement.
awk -v ORS="-" '{print ...}' file
Par exemple:
awk -v ORS="-" '1' <<< "hello
man"
Retourne "hello-man-".
printf
(préférable)Alors que print
attache ORS
après l'enregistrement, printf
ne le fait pas. Ainsi, printf "hello"
affiche simplement "bonjour", rien d’autre.
$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye
Enfin, notez qu'en général, il manque une dernière ligne, de sorte que l'invite du shell sera dans la même ligne que la dernière ligne de la sortie. Pour nettoyer cela, utilisez END {print ""}
afin qu'une nouvelle ligne soit imprimée après tout le traitement.
$ seq 5 | awk '{printf "%s", $0}'
12345$
# ^ Prompt here
$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
une manière
awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
Si Perl est une option, voici une solution utilisant l'exemple de fedorqui:
seq 5 | Perl -ne 'chomp; print "$_ "; END{print "\n"}'
Explication:chomp
supprime la nouvelle ligneprint "$_ "
imprime chaque ligne en ajoutant un espace
le bloc END{}
est utilisé pour imprimer une nouvelle ligne
sortie: 1 2 3 4 5
Vous pouvez simplement utiliser ORS dynamiquement comme ceci:
awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out