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 que
awk code> est possible, mais pour moi, c'est un nouvel outil complet. La meilleure option que je puisse utiliser l'utilisation d'un
en boucle code >, Traitement d'une ligne à la fois. J'ai lu, que l'utilisation d'un
tandis 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-vous
ksh code>?
Le fichier d'entrée contient-il les chaînes
line1: / line2: / line3: code>? Alternativement, quelle est la sortie exacte de
CAT CODE>?