OVH Cloud OVH Cloud

filtrage d' un fichier texte

5 réponses
Avatar
Bayrouni
Bonsoir,

J'ai un fichier contenant des groupes de lignes, les groupes
étant séparés entre eux par une ligne vide.
Voici un exemple:

fichier1
fichier2
fichier3

fichier4
fichier23


fichier12
fichier442
fichier388
fichier543

Comment faire en bash pour ne retenir que la première ligne
de chaque groupe de lignes.

Dans mon exemple celà donnerait:

fichier1
fichier4
fichier12

Merci


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

5 réponses

Avatar
Florent Bayle
--nextPart1675355.K6RYjXiX3S
Content-Type: text/plain;
charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Le mercredi 28 juin 2006 22:42, Bayrouni a écrit :
Bonsoir,

J'ai un fichier contenant des groupes de lignes, les groupes
étant séparés entre eux par une ligne vide.
Voici un exemple:

fichier1
fichier2
fichier3

fichier4
fichier23


fichier12
fichier442
fichier388
fichier543

Comment faire en bash pour ne retenir que la première ligne
de chaque groupe de lignes.

Dans mon exemple celà donnerait:

fichier1
fichier4
fichier12

Merci



Avec /tmp/test le fichier d'exemple :

:~$ perl -ne 'print if ($a!=1 && !m/^$/); $a=1; $a=0 i f (m/^$/)' /tmp/test
fichier1
fichier4
fichier12
:~$

Tu peux aussi y "piper" la sortie d'une commande :

:~$ cat /tmp/test | perl -ne 'print if ($a!=1 && !m/^$/); $a=1; $a=0 if (m/^$/)'
fichier1
fichier4
fichier12
:~$

Bon, ce n'est pas du "bash pur", mais :
- c'est utilisable dans un script shell
- tu as 99,99% de chances de trouver perl sur une Debian, étant donné qu'il fait parti de la "base"

--
Florent

--nextPart1675355.K6RYjXiX3S
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (GNU/Linux)

iD8DBQBEovUcM+Ix3/RCm3gRAt5rAJ9x0XZjOxX2JWDAx+Heb8hq0iIblACg2rr5
rxmURaLq20ek+Uwuj+StjXM =u2FB
-----END PGP SIGNATURE-----

--nextPart1675355.K6RYjXiX3S--


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Max
2006/6/28, Bayrouni :
J'ai un fichier contenant des groupes de lignes, les groupes
étant séparés entre eux par une ligne vide.
Voici un exemple:

fichier1
fichier2
fichier3

fichier4
fichier23


fichier12
fichier442
fichier388
fichier543

Comment faire en bash pour ne retenir que la première ligne
de chaque groupe de lignes.



cat fichier | grep -A 1 '^$' | tr -d '-' | grep -v '^$'

petite explication :
le 1er grep recherche les lignes vides ('^$'), et affiche la ligne
suivante (-A 1), donc là on obtient en plus la 1ère ligne d'un groupe
car toujours précédée d'une ligne vide
tr -d '-' sert à supprimer les délimiteurs '--' inséré par grep da ns
le résultat
le dernier grep recherche les lignes qui ne sont pas vide -> 1eres
lignes des groupes
Avatar
laurent besson
Le jeudi 29 Juin 2006 01:15, Max a écrit :
cat fichier | grep -A 1 '^$' | tr -d '-' | grep -v '^$'



Manquera la premiere chaine de caractère !

dans :
fichier1
fichier2

fichier3
fichier4

fichier5

Affichera :
fichier3
fichier5
Avatar
Max
Le 29/06/06, laurent besson a écrit :
Le jeudi 29 Juin 2006 01:15, Max a écrit:
> cat fichier | grep -A 1 '^$' | tr -d '-' | grep -v '^$'

Manquera la premiere chaine de caractère !

dans :
fichier1
fichier2

fichier3
fichier4

fichier5

Affichera :
fichier3
fichier5





oui effectivement, donc il faut insérer une ligne vide au début, donc
je corrige :
echo | cat - fichier | grep -A 1 '^$' | tr -d '-' | grep -v '^$'
Avatar
Jérôme Moinet
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

:~$ perl -ne 'print if ($a!=1 && !m/^$/); $a=1; $a=0 if (m/^$/)' /tmp/test
fichier1
fichier4
fichier12



Autre solution, avec awk :

cat fichier | awk 'BEGIN {fl=1 ; p=0} {if (fl == 1 && $1 != "") {print
$1 ; fl=0 ; p=0} else {if (p == 0 && $1 == "") p=1; if (p == 1 && $1 ! "") {print $1 ; p=0}}}'

Mais le grep -A 1 est bien plus élégant :)

jerome
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFEo3ih3ygQTLujCrQRAu+kAJ4iNcdZhyRbpZnJDaFab6jskYHaVQCffaJV
5zrbEa1D1DgbweQO/OHx5+s =7Y+e
-----END PGP SIGNATURE-----


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact