Extrait de lignes d'un fichier unix

Résolu/Fermé
Coco44 - 2 déc. 2010 à 11:14
 Coco44 - 3 déc. 2010 à 09:54
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

zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 567
2 déc. 2010 à 11:31
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 ç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.
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 567
2 déc. 2010 à 12:31
Affiche un exemple concret des chaines recherchées dans leur contexte, s'il te plaît, merci.
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 567
2 déc. 2010 à 16:52
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
sympa la solution ! par contre je comprends pas les $4 $5 et $6.
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 567
3 déc. 2010 à 09:50
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.
0
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...).
0
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.
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 ?
0
arrfff, j'ai trouvé finalement : il faut mettre /!w au lieu de /w
Merci de ton aide pour la commande, tout marche impec maintenant !
0