-1
votes

Fichier texte divisé et processus dans sh

J'ai un fichier texte avec virgade (,) séparateur: xxx

Je voudrais obtenir la sortie: xxx

Pour chaque ligne I Champ aplatie "Tél: + 33xxxxxxxx; KN-CORP-groupes = 3_6" dans "3,6" par exemple "

auriez-vous une idée sur la façon dont je pouvais faire cela? Merci


1 commentaires

Désolé, ce n'est pas la façon dont Stackoverflow fonctionne. Les questions de la forme "Je veux faire x, veuillez me donner des conseils et / ou un code d'échantillon" sont considérés comme étant hors sujet. Veuillez visiter le centre d'aide et lire Comment Demander , et surtout lire Pourquoi "peut-il m'aider quelqu'un?" pas une question réelle?


7 Réponses :


3
votes

pour ces données: xxx

sortie: xxx

expliqué: xxx / p>


1 commentaires

Votre champ manquant dans la sortie. Au lieu [ = _] pour le délimiteur et $ 1, $ 2, $ 3, 4 $, $ 5, $ 7, 8 $, 9 $ pour la liste des champs.



0
votes

Pourriez-vous essayer de suivre, si je l'ai bien compris, vous devez chercher des lignes qui ont une chaîne Tel: + 33xxxxxxx code> dedans. XXX PRE>



2ème solution: em> strong> Si vous ne voulez pas que vous ne voulez pas du code dur (ces valeurs pourraient être n'importe où dans INPUT_FILE) Les numéros de champ puisse ensuite suivre. P >

60,tel:+33xxxxxxx,840191,1,0,3,6,8401
61,tel:+33xxxxxxx,840191,1,1,4,60,8401
60,tel:+33xxxxxxx,840191,1,0,3,5,8401
61,tel:+33xxxxxxx,840191,1,1,1,59,8401


1 commentaires

@Shakile, pourriez-vous vérifier et laissez-moi savoir si cette solution est utile pour vous?



0
votes

Utiliser gawk : xxx

Nous devons simplement traiter la prochaine colonne $ (nf-1) avec Gensub () et NF comme condition pour ignorer les lignes vides.


0 commentaires

0
votes
$ sed 's/[^,]*;[^,]*\([0-9]*\)_/\1,/' file
60,tel:+33xxxxxxx,840191,1,0,3,6,8401
61,tel:+33xxxxxxx,840191,1,1,4,60,8401
60,tel:+33xxxxxxx,840191,1,0,3,5,8401
61,tel:+33xxxxxxx,840191,1,1,1,59,8401

0 commentaires

0
votes

SED

awk a déjà été couvert par d'autres réponses. Voici une alternative utilisant sed :

$ sed -e -e 's / [^,] +; [^ =] + = //' -E 'S / _ /, /' Fichier

Explication
  • sed -e afin d'utiliser expressions régulières étendues .
  • sed -e exécute un script SED. N'oubliez pas de joindre les scripts SED en guillemets simples ( '), pour arrêter la coque de l'expansion. Nous devrons exécuter deux scripts.

  • s / [^,] +; [^ =] + = // le premier des deux scripts. Lâche la chaîne que nous ne voulons pas ( tel: + 33xxxxxxx; kn-corp-groupes = ):

    • Substitut ( S / )
    • Un ou plusieurs caractères qui ne sont pas la virgule ( [^,] + )
    • suivi d'un seul point-virgule (; )
    • suivi d'un ou plusieurs caractères qui ne sont pas le signe égal ( [^ =] + )
    • suivi d'un seul signe égal ( = )
    • avec rien, c'est-à-dire supprimer la chaîne correspondante ( // ).
    • s / _ /, / le second des deux scripts. Remplace le soulignement ( _ ) entre les deux numéros avec une virgule (, ):
      • Substitution ( S / )
      • Un seul soulignement ( _ )
      • avec une virgule ( /, / ).

        Alternatives

        Quelques alternatives shell supplémentaires sans Awk:

        • sed Tuyauterie

          Les deux scripts sed ont aussi pu être utilisés avec un tuyau:
          $ sed -e 's / [^,] +; [^ =] + = //' Fichier | Sed 's / _ /, /' .
          Cela serait moins efficace, mais si la vitesse n'est pas une préoccupation, certaines personnes peuvent trouver plus facilement de comprendre. Voir cette réponse pour plus de détails.
        • sed + tr

          La deuxième partie du tuyau ci-dessus peut être échangée avec une simple commande tr de
          $ sed -e 's / [^,] +; [^ =] + = //' Fichier | TR '_' '', '.
        • tr + couper

          Nous pouvons aussi faire sans sed:
          $ tr '= _' '', '
          Ici, nous remplacons d'abord le = et le _ avec , à l'aide de tr , afin d'avoir nos champs séparés par virgules,
          et imprimer tous les champs sauf le 6ème avec couper ( -d désigne le délimiteur qui est , et -f désigne les champs que nous voulons imprimer, c'est-à-dire tous sauf le 6).
        • sed sous-titrage du groupe

          Voir aussi Réponse de ED Morton qui utilise le sous-titrage du groupe de SED .


2 commentaires

WRT AWK a déjà été couvert par d'autres réponses - SE SED, voir Stackoverflow.com/a/55165137/ 1745001 .


@Edmorton Tu as raison, je ne l'ai pas vu quand j'avais initialement commencé à écrire ma réponse. J'ai ajouté une référence à cela.



0
votes

Utilisation de Perl Regex xxx

avec vos entrées données xxx


0 commentaires

0
votes
awk '{sub(/_/,",")}{print (substr($0, 1,29) substr($0, 60))}' file

60,tel:+33xxxxxxx,840191,1,0,3,6,8401
61,tel:+33xxxxxxx,840191,1,1,4,60,8401
60,tel:+33xxxxxxx,840191,1,0,3,5,8401
61,tel:+33xxxxxxx,840191,1,1,1,59,8401

0 commentaires