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
- 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.