Extrait de lignes d'un fichier unix [Résolu/Fermé]

Signaler
-
 Coco44 -
Bonjour,

je cherche à "découper" un fichier unix en 3 fichiers selon la présence ou non d'une chaîne de caractère à des positions précises dans le fichier initial.

En gros, si la chaîne 'XXX' est trouvée de la position 5 à 7 --> Sortie vers fichier A
...Si la chaîne 'YYY' est trouvée de la position 15 à 17 --> Sortie vers fichier B
...

Avec la commande suivante :
grep 'XXX' mon_fichier | cut -c5-7 > fichierA
=> J'extrait seulement les caractères 5 à 7 dans mon fichier A alors qu'il me faut la ligne entière.

Comment obtenir ce résultat ?

Merci d'avance de vos réponses.

4 réponses

Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283
Salut,

$ ls
plop

$ cat plop
acbdXXXhijklmnopqrstuvwxyz
abcdefghijklmnYYYrstuvwxyz
abcdefghXXXlmnopqrstuvwxyz
abYYYfghijklmnopqrstuvwxyz

$ sed -n '/^.\{4\}XXX/w fichA' plop

$ sed -n '/^.\{14\}YYY/w fichB' plop

$ ls
fichA  fichB  plop

$ cat fichA
acbdXXXhijklmnopqrstuvwxyz

$ cat fichB
abcdefghijklmnYYYrstuvwxyz

$
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

merci ça marche pas trop mal... par contre j'ai un souci parce que la chaine recherchee est assez longue et au delà de 4 caractères ça ne marche pas !!
La vraie chaine recherchée est : '+0000000000'
En recherchant +000 ça marche
mais +0000 non.
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283
Affiche un exemple concret des chaines recherchées dans leur contexte, s'il te plaît, merci.
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283
Sinon le plus simple c'est encore avec "awk" :

$ ls
bar.awk  toto

$ cat toto
C01IC+0000003822+0000000000+0000000000+00+00000
C01IC+0000003822+0000000000+0006593856+01+00000
C01IC+0000003822+0000000000+0006593856+01+00001

$ cat bar.awk
$4 ~ /0000000000/ && $5 ~ /00/ && $6 ~ /00000/ { print $0 >> "fichA" }
$4 !~ /0000000000/ && $5 !~ /00/ && $6 ~ /00000/ { print $0 >> "fichB" }
$4 !~ /0000000000/ && $5 !~ /00/ && $6 !~ /00000/ { print $0 >> "fichC" }

$ awk -F'+' -f bar.awk toto

$ ls
bar.awk  fichA  fichB  fichC  toto

$ cat fichA
C01IC+0000003822+0000000000+0000000000+00+00000

$ cat fichB
C01IC+0000003822+0000000000+0006593856+01+00000

$ cat fichC
C01IC+0000003822+0000000000+0006593856+01+00001
$

;-))
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

sympa la solution ! par contre je comprends pas les $4 $5 et $6.
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283
On définit le séparateur de champs comme étant "+" (le signe plus), -F'+'.
Ensuite on compare les champs avec des conditions :

$4 ~ /0000000000/ && $5 ~ /00/ && $6 ~ /00000/ { print $0 >> "fichA" }

Si le champs "4" ($4) est égal à /0000000000/ et (&&) le champ 5 à /00/ et le champ 6 à /00000/ on écrit la ligne ($0) dans fichA.

etc.
ok, je pensais que c'était à la 4ème occurrence de '+', la 5ème et la 6ème donc ça collait pas.

Merci, je vais voir quelle solution je prends au final (ça doit être un script réutilisable donc avec des paramètres comme le fichier d'entrée, le séparateur ou la position...).
Voici les 3 différentes lignes :

C01IC+0000003822+0000000000+0000000000+00+00000 -> Fichier A
C01IC+0000003822+0000000000+0006593856+01+00000 -> Fichier B
C01IC+0000003822+0000000000+0006593856+01+00001 -> Fichier C


Je dois tester 3 champs différents qui sont en fait des numériques signés (+001230...). Les champs en questions sont les 3 derniers de chaque ligne. Je dois éclater ces lignes dans 3 fichiers :
- Fichier A : les 3 champs sont à 0.
- Fichier B : champ 1 et 2 renseignés mais champ 3 à 0.
- Fichier C : aucun des champs n'est à 0.
désolé c'est bon ! mon fichier en entrée déconnait (un caractère à la con...).
Donc j'ai bien extrait mes données vers le fichier A.
Par contre comment je peux extraire les lignes dans lesquelles la chaîne n'a pas été trouvée ?
arrfff, j'ai trouvé finalement : il faut mettre /!w au lieu de /w
Merci de ton aide pour la commande, tout marche impec maintenant !