0
votes

Rediriger d'abord à un fichier stdout d'avant puis stard

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


1 commentaires

Vous mentionnez dans votre question que le fichier TMP contient le premier starr dans votre sortie, le fichier semble avoir d'abord stdout . Pourriez-vous s'il vous plaît élaborer ce que vous voulez dire ici?


4 Réponses :


1
votes

C'est un petit exemple:

Je ne suis pas sûr de ce que vous voulez dire, si je comprends ...

Si vous souhaitez rediriger stdout à file_out , redirect starr à file_err , vous pouvez le faire ... xxx


3 commentaires

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 . 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 . 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 dans le fichier temporaire.


D'accord, j'ai donc besoin de créer deux fichiers pour le faire.



1
votes

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


0 commentaires

2
votes

Le problème que vous rencontrez est due à la mise en mémoire tampon des flux 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 toujours fort> non coupé. C'est pourquoi vous avez d'abord rencontré la sortie de 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:


1 commentaires

Comme alternative à l'utilisation de stdbuf , un appel à fflush () à 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" (Portable à TOUS AWKS) Pour imprimer sur STDRERR au lieu de Imprimer> "/ dev / stardr" (fonctionne uniquement dans certaines hornières) alors vous aurez également besoin de Fermer ("CAT> & 2") Après chaque impression pour éviter CAT Aussi faire tampon.



0
votes

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);
    }
}'


0 commentaires