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, printinsère automatiquement un ORSaprès l'impression. ORSsignifie "séparateur d'enregistrements de sortie" et utilise par défaut la nouvelle ligne. Ainsi, chaque fois que vous dites print "hi"awk imprime "hi" + nouvelle ligne.
Cela peut être modifié de deux manières différentes: en utilisant un fichier vide ORSou en utilisant printf.
Utiliser un vide ORS
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 vide ORS, 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"
Renvoie "hello-man-".
Utilisation printf(préférable)
Bien que printjoint ORSaprès l'enregistrement, printfne le fait pas. Ainsi, printf "hello"imprime 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, 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.
$ seq 5 | awk '{printf "%s", $0}'
12345$
# ^ prompt here
$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
printfinterprète%sdonc utiliserprintf "%s" whateverau lieu deprintf whatever.