web-dev-qa-db-fra.com

awk sans impression newline

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
151
Sharat Chandra

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.

199
CodeRain

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.

71
danben

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.

Utilisation d'un ORS vide

awk -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-".

Utiliser 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
38
fedorqui

une manière

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

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 ligne
print "$_ " imprime chaque ligne en ajoutant un espace
le bloc END{} est utilisé pour imprimer une nouvelle ligne

sortie: 1 2 3 4 5

1
Chris Koknat

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

0
Andrea Barletta