6
votes

Obtenez des lignes spécifiques à partir d'un modèle de plage répété dans un fichier texte

wow, cela semble tellement compliqué dans le titre, mais je suppose que ce n'est pas tout à fait.

J'ai des fichiers texte qui ont fondamentalement cette mise en page: p> xxx pré>

J'ai utilisé SED pour que tout entretien entre et puis d'autres informations extraites dont j'avais besoin. P> xxx pré>

Cependant, les participants ne répondent parfois pas, auquel cas le fichier ressemble à ceci:

Stimulus ...
...
...
...
Stimulus ...
...
...
...
Response


1 commentaires

Est-ce que '/ stimulus /, / réponse | stimulus / fonctionne? Hm .. probablement pas. Ceci est généralement résolu avec un script AWK qui définit une FLG pour les deux valeurs, lorsque les deux sont vrais, faites ce dont vous avez besoin. Bonne chance.


6 Réponses :


7
votes

Une manière sale, bien qu'elle semblait fonctionner dans mon test, il pourrait être d'inverser le contenu du fichier, de rechercher à partir de réponse à stimulus et inversez à nouveau le résultat. < P> En supposant que les données d'entrée suivantes: xxx

la commande: xxx

rendements: xxx


EDIT : Pour un exemple avec isolé réponse pièces. Il doit filtrer deux fois (basé sur un commentaire de la OP): xxx


3 commentaires

Élégant. Va le tester un retour.


Je l'ai testé et il y avait un petit problème car il n'y a pas seulement des pièces de stimulus isolées, mais également des pièces de réponse isolées. Cependant, faire la procédure deux fois le tour: TAC Infile | Sed -ne '/ Réponse /, / Stimulus / P' | tac - | sed -ne '/ stimulus /, / réponse / p';)


rendant ainsi tic-tac-toe!



4
votes

Autre option est basculer vers Perl code> et son flip-flop (opérateur de plage): xxx pré>

supposant un fichier d'entrée comme: p>

Stimulus 2...
...
...
...
Response 2
Stimulus 3...
...
...
...
Response 3


0 commentaires

5
votes

Ceci est un pure Solution: xxx pré>

Il commence à remplir le tableau TMP code> Si une liste commençant par stimulus code> trouvé. Si un autre stimulus code> arrive, il efface simplement TMP code> et démarre le travail à nouveau. Si réponse code> trouvé, il imprime le contenu du tableau code> TMP code>. En réalité printf code> intégré fait une boucle implicite. P>

entrée: p> xxx pré>

sortie: p>

Stimulus 2
...
Response 2
Stimulus 3
...
Response 3


5 commentaires

Soumettre des trucs sur chaque réponse , même s'il n'y a pas de stimulus avant. En outre, la regex est overkill: [[$ l = réponse *]] aurait été suffisant.


@gniourf_gniourf: Pourriez-vous me dire quelle sera la sortie s'il n'y a pas de ligne commençant par Stimulus Je suppose une ligne vide. :) Bien sûr, vous pouvez utiliser la correspondance de Glob. Je préfère Regex .


Vous émettez le tableau TMP sur chaque référence , tout ce qui se passe, même s'il n'y avait pas de relulos avant. À cet égard, vous ne répondez pas vraiment à l'OP. Veuillez consulter le commentaire de l'OP dans la réponse de @ Birei.


@gniourf_gniourf: Vous avez raison. C'est une solution pour la question initiale. J'ai corrigé, merci!


Nous avons maintenant à peu près le même algorithme. +1 . :) .



4
votes

voici un pure Solution qui essaie de Minimiser des effets secondaires stupides: xxx

gère également le cas où il y a une réponse mais aucun stimulus .


0 commentaires

4
votes

mis à jour pour gérer les réponses isolées xxx


0 commentaires

4
votes

Très bien sympa et facile pour gnu , à sens unique, aucun tuyaux et outils indésirables: xxx

fichier d'entrée: xxx


et la sortie: < / p> xxx


et mon code pour gnu : xxx

Comme vous pouvez le constater, j'ai besoin de trop de code AWK ...


0 commentaires