Extrait de lignes d'un fichier unix
Résolu
Coco44
-
Coco44 -
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.
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.
A voir également:
- Unix extraire des lignes d'un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Extraire une video youtube - Guide
4 réponses
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 $
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 $
;-))
On définit le séparateur de champs comme étant "+" (le signe plus), -F'+'.
Ensuite on compare les champs avec des conditions :
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.
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.
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.
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.
La vraie chaine recherchée est : '+0000000000'
En recherchant +000 ça marche
mais +0000 non.