J'ai un code GWAK comme celui-ci.
hello hello hello hello hello hello hello hello hello hello howareyou howareyou howareyou howareyou howareyou well well well well well well well well well well well hello 0 hello 1 hello 2 hello 3 hello 4 hello 0 hello 1 hello 2 hello 3 hello 4 howareyou 0 howareyou 1 howareyou 2 howareyou 3 howareyou 4 well 0 well 1 well 2 well 3 well 4 well 0 well 1 well 2 well 3 well 4
4 Réponses :
Je ne suis pas sûr de ce que vous voulez dire, si je comprends ... EM> P> Si vous souhaitez rediriger stdout code> à file_out code>, redirect starr code> à file_err code>, vous pouvez le faire ... p>
Désolé si vous ne comprenez pas, je vais mieux expliquer. Oui, je veux les rediriger à tous les deux dans un fichier, mais le stdout doit être redirigé avant Stderr. Donc, dans le fichier de sortie, j'aurai d'abord les mots sans numéro, puis ceux avec nombre.
- Donc, cela n'est pas possible en une étape, vous devez ajouter une certaine logique pour contrôler le texte. Supposons que votre nom de fichier soit TMP code>. 1. Vous devez créer un fichier temporaire. 2. Rediriger SterderR sur ce fichier temporaire 3. Une fois la commande terminée, copiez et appendez le STDERR dans ce fichier temporaire dans votre fichier TMP code>. 4. Supprimer ce fichier temporaire - Si vous souhaitez l'utiliser plusieurs fois, vous devez ajouter une autre étape (ajouter une étape entre 1-2 ci-dessus): Couper les lignes terminées par le nombre que dans TMP code> dans le fichier temporaire. b>
D'accord, j'ai donc besoin de créer deux fichiers pour le faire.
Il n'y a pas de bon moyen * de raconter AWK ou de la coquille qu'il doit tamponner STDERR jusqu'à ce que l'outil se termine à exécuter. Gardez-le simple et faites simplement ceci:
awk -f script.awk file > out 2>&1
Le problème que vous rencontrez est due à la mise en mémoire tampon des flux Un des Hacks laids que vous pouvez appliquer est l'utilisation de stdout code> et starr code>. Les deux flux ont des paramètres de mémoire tampon par défaut différents. Tandis que stdout code> est tamponné à la ligne lorsque vous écrivez sur un terminal, il est très bien tamponné lorsqu'il écrit à un flux / tuyau / fichier. Le flux stardr code> d'autre part est starr code> et seulement la sortie de stdout code> dans votre fichier TMP code>. Sachez cependant que la sortie sera entrelée lorsque vous produirez plus de lignes comme tout d'un coup, le tampon de stdout code> sera plein et écrit dans le fichier, en suivant une sortie de starr code> jusqu'à ce que la mémoire tampon suivante de stdout code> est pleine. Le problème est bien expliqué dans la page suivante:
STDBUF code> pour modifier la mise en mémoire tampon des données de données de awk code>: p> hello
hello 1
hello
hello 2
...
Comme alternative à l'utilisation de stdbuf code>, un appel à fflush () code> à la fin de chaque paire d'impressions dans AWK peut forcer toute la sortie à être entrelacée au fur et à mesure de son apparition. . Notez que si vous utilisez imprimer | "CAT> & 2" CODE> (Portable à TOUS AWKS) Pour imprimer sur STDRERR au lieu de Imprimer> "/ dev / stardr" code> (fonctionne uniquement dans certaines hornières) alors vous aurez également besoin de Fermer ("CAT> & 2") CODE> Après chaque impression pour éviter CAT CODE> Aussi faire tampon.
Lit binaire vieux, mais si quelqu'un en a encore besoin:
echo "some stuff" | awk '{
for (i=0;i<5;i++){
print $0;
# print i on stderr
system(">&2 echo " i);
}
}'
Vous mentionnez dans votre question que le fichier
TMP code> contient le premierstarr code> dans votre sortie, le fichier semble avoir d'abordstdout code>. Pourriez-vous s'il vous plaît élaborer ce que vous voulez dire ici?