Utilisation de Linux, comment puis-je obtenir la sortie souhaitée ci-dessous pour l'entrée donnée.
Fichier d'entrée: Ma sortie doit être: p> StringA1, stringB1| stringC1
StringA1, stringB1| stringD1
StringA1, stringB1| stringE1
StringA2, stringB2| stringC2
StringA2, stringB2| stringD2
StringA3, stringB3| stringC3
StringA3, stringB3| stringD3
StringA3, stringB3| stringE3
StringA3, stringB3| stringF3
3 Réponses :
Lorsque vous faites une solution dans explication: strong> < BR>
Autres moyens utilise SED CODE>, il deviendra difficile à lire et à maintenir: S /, / \ V / CODE> La plupart des , code> doivent être remplacés, mais pas celui de la chaîne de remplacement.
: a code> répéter la commande suivante (jusqu'à ce que ta code>) alors qu'un remplacement est trouvé.
( BR>
\ r code> Utilisez le marqueur Windows CR comme marqueur où nous voulons une nouvelle ligne lorsque vous avez terminé.
\ 1 code> Remplacez par la première chaîne mémorisée (par exemple stringa1, stressb1 code>).
/ \ 1 \ 2 \ r \ 1 \ 3 / code> Remplacez le dernier , code> avec un marqueur de nouvelle ligne et le démarreur.
TA; code> répéter jusqu'à ce que tous les remplacements soient terminés.
s / \ v /, / g; code> restaurer les caractères , code>.
s / \ r / \ n / g ' code> remplacez le nouveau marqueur de ligne avec une nouvelle ligne réelle. p> Awk code> et un tandis que la boucle code>. Pour un fichier volet, j'ai recommandé awk code>, vous voulez peut-être essayer ceci vous-même avant que quelqu'un affiche une réponse. P> p>
Maintenant, c'est une utilisation intéressante de SED code> pour le problème. Bien que l'approche AWK code> est probablement l'outil pour le travail, l'utilisation de sed code> ici (ainsi que la bonne explication) garantit certainement l'UV.
REMARQUE: B> Vous devez toujours vous scinder Field1 i>, votre commande fournit la sortie de "Ligne1: Stringa1, Stringb1 | stringc1" code>, etc.
@ Davidc.Rankin J'ai fait la même hypothèse que MarkP l'a fait, testant avec Echo "Stringa1, Stringb1 | Stringc1, Stringd1, stress1" | sed .... code>. Ajouter 's / [^:]: //' peut aider si nécessaire.
Oui, je pensais ça. Vraiment étrange d'avoir les lignes dans la question avec la ligne ambiguë à l'avant qui ressemble à elle / peut ne pas être dans le fichier. Tant pis. Il est couvert. Encore une fois, bon travail en utilisant sed code>.
Hypothèses:
ligne #: code> (sinon nous devons simplement modifier le script proposé) li>
ul> échantillons de données: p> xxx pré> one awk code> solution: p> xxx pré> Où: p>
-
-f "[ |]" code> - Utilisez la virgule et le tuyau (, | code>) en tant que délimiteurs d'entrée li>
-
pour (i = 3; i <= nf; i ++) code> - pour les champs 3 à la fin de la ligne (NF == Nombre de champs == Dernier champ) LI>
-
{printf ...} code> - Imprimer 1st, 2e et ITH CODE> Champs Li>
ul> résultats d'exécution ci-dessus: p> xxx pré> p>
Remarque: b> Vous devez toujours vous diviser Field1 i>, votre commande fournit la sortie de "Line1: Stringa1, Stringb1 | stringc1" code>, etc. (bien que Le reste de votre approche est correct, donc cela justifie toujours l'UV. Il semble que le problème était une surveillance.)
@ DAVIDC.RANKIN Voir mes hypothèses (NO 'Line n °:' dans le fichier actuel), mon fichier de données ( chat strings.dat code>) et mon commentaire / question à l'op re: 'Line #: ' dans le fichier; Ce n'est pas clair (pour moi) si la ligne de la ligne des chaînes: «Faites partie du fichier ou de l'OP étiquetant simplement les lignes de la question; Si l'OP revient et dit 'Line #:' est dans le fichier alors c'est assez facile pour analyser
Gotcha, j'ai lu vos hypothèses, mais je ne l'ai pas enfoncée lorsque je dirigeai la sortie. Il a couvert de toute façon à ce stade.
Pour produire votre sortie souhaitée, si vous divisez sur pour la seconde, vous pouvez supprimer si votre fichier de données n'inclut pas les résultats sont les mêmes de toute façon, mais en utilisant La solution proposée [ |] code>, vous devez supprimer davantage le début field1 em> avant de sortir les résultats. Il y a deux façons de faire cela. La première façon simplement divise tout field1 em> dans un tableau avec le fieldsep em> de '' code>, la seconde est avec une combinaison de substrat-substrat & longueur code>. Le premier est le moyen simple de le faire à l'aide de la commande Split () code>, par exemple divisé () Code> ci-dessus et remplacer arr [2] code> avec: p> "ligne [0-9] : " code> comme préfixe pour chaque ligne, vous pouvez inclure les éléments suivants comme votre printf code> pour gérer les cas: p> divisé () code> serait la voie recommandée. p> AWK code> avec votre fichier de données (nommé fichier code> ajuster au besoin), vous pouvez simplement sélectionner-copier / coller-coller-coller dans un xterm avec le Fichier code> dans le répertoire actuel pour obtenir les résultats, par exemple P> $ awk -F '[,|]' '{
> split ($1, arr, / /)
> for (i=3; i<=NF; i++) {
> printf "%s,%s|%s\n", arr[2], $2, $i
> }
> }' file
StringA1, stringB1| stringC1
StringA1, stringB1| stringD1
StringA1, stringB1| stringE1
StringA2, stringB2| stringC2
StringA2, stringB2| stringD2
StringA3, stringB3| stringC3
StringA3, stringB3| stringD3
StringA3, stringB3| stringE3
StringA3, stringB3| stringF3
Ou ajouter : code> comme délimiteur d'entrée supplémentaire et champs de processus 2, 3 et 4-NF
Pouvez-vous réparer le formatage de votre message afin qu'il soit plus facile de lire et de déterminer ce que vous voulez?
couper code> pourrait faire cela.awk code> aussi. Essayez quelque chose, alors nous pouvons vous aider.Lorsque vous ne savez pas où commencer, vous pouvez expliquer quelles options que vous avez considérées, comme: "Je ne sais pas comment traiter les substrings que j'ai trouvés après avoir utilisé
couper code> sur champ delim| code> ou sur ','. Peut-être queawk code> est possible, mais pour moi, c'est un nouvel outil complet. La meilleure option que je puisse utiliser l'utilisation d'unen boucle code >, Traitement d'une ligne à la fois. J'ai lu, que l'utilisation d'untandis que la boucle code> donne une mauvaise performance. Maintenant je suis coincé, que dois-je faire? "Vous mentionnez
linux code>, oùbash code> est la coque par défaut. Pourquoi voulez-vousksh code>?Le fichier d'entrée contient-il les chaînes
line1: / line2: / line3: code>? Alternativement, quelle est la sortie exacte deCAT CODE>?