Je veux que la variable sum / NR soit imprimée côte à côte à chaque itération. Comment éviter que awk n'imprime 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
printf
interprète%s
donc utiliserprintf "%s" whatever
au lieu deprintf whatever
.printf "%s",whatever
Vous avez oublié la virgule. Vous pouvez également étendre avec plus de variables et les séparer par une virgule.La variable ORS (séparateur d'enregistrement de sortie) dans AWK est par défaut "\ n" et est imprimée après chaque ligne. Vous pouvez le changer en "" dans la
BEGIN
section si vous voulez que tout soit imprimé consécutivement.la source
""
(sans espace) pour qu'il n'ait aucune séparation.awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
ORS="\r"
si vous voulez par exemple imprimer un compteur montrant la progression.Je suppose que beaucoup de gens entrent dans cette question à la recherche d'un moyen d'éviter la nouvelle ligne
awk
. Ainsi, je vais proposer une solution à cela, puisque la réponse au contexte spécifique était déjà résolue!Dans
awk
,print
insère automatiquement unORS
après l'impression.ORS
signifie "séparateur d'enregistrements de sortie" et utilise par défaut la nouvelle ligne. Ainsi, chaque fois que vous ditesprint "hi"
awk imprime "hi" + nouvelle ligne.Cela peut être modifié de deux manières différentes: en utilisant un fichier vide
ORS
ou en utilisantprintf
.Utiliser un vide
ORS
Cela renvoie "helloman", tous ensemble.
Le problème ici est que tous les awks n'acceptent pas de définir un vide
ORS
, vous devez donc probablement définir un autre séparateur d'enregistrement.Par exemple:
Renvoie "hello-man-".
Utilisation
printf
(préférable)Bien que
print
jointORS
après l'enregistrement,printf
ne le fait pas. Ainsi,printf "hello"
imprime simplement "bonjour", rien d'autre.Enfin, notez qu'en général, cela manque une nouvelle ligne finale, 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 ""}
pour qu'une nouvelle ligne soit imprimée après tout le traitement.la source
une manière
la source
printf $0
, car$0
peut contenir des chaînes comme%F
, etc ... A la suite échoue facilement (au moins avec GAWK 3.1.5):echo "%F"|awk '{printf $0}'
. Utilisezprintf "%s",$0
plutôt le.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
la source
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 espacele
END{}
bloc est utilisé pour imprimer une nouvelle ligneproduction:
1 2 3 4 5
la source