J'ai un fichier texte avec virgade (,) séparateur: Je voudrais obtenir la sortie: p> Pour chaque ligne I Champ aplatie "Tél: + 33xxxxxxxx; KN-CORP-groupes = 3_6" dans "3,6" par exemple " P> auriez-vous une idée sur la façon dont je pouvais faire cela?
Merci p> p>
7 Réponses :
pour ces données: sortie: p> expliqué: p>
Votre champ manquant dans la sortie. Au lieu [ = _] code> pour le délimiteur et
$ 1, $ 2, $ 3, 4 $, $ 5, $ 7, 8 $, 9 $ code> pour la liste des champs.
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.
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
@Shakile, pourriez-vous vérifier et laissez-moi savoir si cette solution est utile pour vous?
Utiliser Nous devons simplement traiter la prochaine colonne gawk code>:
$ (nf-1) code> avec
Gensub () Code> et
NF code> comme condition pour ignorer les lignes vides. p> p>
$ 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
awk em> a déjà été couvert par d'autres réponses. Voici une alternative utilisant sed em>: p>
Quelques alternatives shell supplémentaires sans Awk: P>
$ sed -e -e 's / [^,] +; [^ =] + = //' -E 'S / _ /, /' Fichier CODE> P> P>
Explication H3>
sed -e code> afin d'utiliser expressions régulières étendues em>. li>
sed -e code> exécute un script SED. N'oubliez pas de joindre les scripts SED en guillemets simples (
' code>), pour arrêter la coque de l'expansion. Nous devrons exécuter deux scripts. P> li>
s / [^,] +; [^ =] + = // code> le premier des deux scripts. Lâche la chaîne que nous ne voulons pas ( tel: + 33xxxxxxx; kn-corp-groupes = em>): p>
S / CODE>) LI>
[^,] + code>) li>
; code>) li>
[^ =] + code>) li>
= code>) li>
// code>). Li>
ul> li>
s / _ /, / code> le second des deux scripts. Remplace le soulignement (
_ code>) entre les deux numéros avec une virgule (
, code>):
S / CODE>) LI>
_ code>) li>
/, / code>). li>
ul> li>
ul>
Alternatives h3>
sed code> Tuyauterie strong>
Les deux scripts sed em> ont aussi pu être utilisés avec un tuyau:
$ sed -e 's / [^,] +; [^ =] + = //' Fichier | Sed 's / _ /, /' code>.
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. Li>
sed code> +
tr code> strong>
La deuxième partie du tuyau ci-dessus peut être échangée avec une simple commande tr code> de
$ sed -e 's / [^,] +; [^ =] + = //' Fichier | TR '_' '', ' CODE>. LI>
tr code> +
couper code> strong>
Nous pouvons aussi faire sans sed:
$ tr '= _' '', '
Ici, nous remplacons d'abord le = code> et le
_ code> avec
, code> à l'aide de
tr code>, afin d'avoir nos champs séparés par virgules,
et imprimer tous les champs sauf le 6ème avec couper code> (
-d code> désigne le délimiteur qui est
, code> et
-f code> désigne les champs que nous voulons imprimer, c'est-à-dire tous sauf le 6). li>
sed code> sous-titrage du groupe strong>
Voir aussi Réponse de ED Morton qui utilise le sous-titrage du groupe de SED . li>
ul>
WRT AWK a déjà été couvert par d'autres réponses code> - 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.
Utilisation de Perl Regex avec vos entrées données p>
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
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?