Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HS][BASH]filtrage d' un fichier texte

9 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



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

9 réponses

Avatar
Marc Chantreux
salut,

en zsh :

while { old=$line && read line } {
[[ -z $old ]] && print $line
} < fichier


en bash :

while old=$line && read line; do
test -z $old && echo $line
done < fichier

par contre : si ton fichier est gros, il vaut mieux utiliser awk :

awk ' { if ( old=="") { print }; old=$0 }' <fichier

cordialement,
mc


--
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
Bayrouni
Merci à vous tous,
En plus d'avoir trouvé la solution grâce à vous, et comme
c'est quasiment tout le temps avec GNU/Linux, il y a
plusieurs manières de procéder. Donc pour moi, ce sont des
solutions et des enrichissements.

J'ai déjà regarder la soltion avec cat, grep et tr.

Idem avec la boucle while (astucieuse).

Je vais regarder la soltion awk ce soir (un peu de lecture
awk pour rafraichir mes légères connaissances en awk).

Pour la solution perl, certes c'est un langage puissant mais
je ne le connais pas du tout (je aurais cependant pris
cette solution s'il n'y avait que ça. meme si juste pour
l'appliquer :).

GNU/Linux satisfait tout le monde et ce n'est que la pointe
de l'iceberg ici :)

Que demander de plus :)

Encore une fois Merci à tous sans exception.

--
Bayrouni


--
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
Gilles MISSONNIER
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---1480404480-114426669-1151673378=:29345
Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: QUOTED-PRINTABLE

ça marche pô, car il affiche des lignes vides si il y a + de 2 lignes
vides qui se suivent...
---------------------------
salut,
en bash :

while old=$line && read line; do
test -z $old && echo $line
done < fichier

par contre : si ton fichier est gros, il vaut mieux utiliser awk :

awk ' { if ( old=="") { print }; old=$0 }' <fichier

cordialement,
mc


---1480404480-114426669-1151673378=:29345--


--
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
Marc Chantreux
Gilles MISSONNIER wrote:
ça marche pô, car il affiche des lignes vides si il y a + de 2 lignes
vides qui se suivent...



la réponse est dans la question :)

while old=$line && read line; do
test -z $old && test -n $line && echo $line
done < fichier

awk ' { if ( old=="" && $0 !="" ) { print }; old=$0 }' <fichier


--
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
Marc Chantreux
> sed -ne '/./{p;:a;n;/./ba}' <fichier




joli ! il y a donc des choses a faire avec sed ! :)


--
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
Jacques L'helgoualc'h
Bayrouni a écrit, jeudi 29 juin 2006, à 13:37 :
[...]
Que demander de plus :)



Une solution Sed, bien sûr :)

sed -ne '/./{p;:a;n;/./ba}' <fichier


sed -ne '/./{ # si une ligne est non-vide
p # on écrit
:a
n # puis on avale les non-vides suivantes en boucle...
/./ba
}'

--
Jacques L'helgoualc'h


--
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
Bayrouni
Marc Chantreux a écrit :

sed -ne '/./{p;:a;n;/./ba}' <fichier





joli ! il y a donc des choses a faire avec sed ! :)




J'ai essayé toutes les propositions, et comme mon fichier
est effectivement voluminueux j'ai adopté celle-là:
awk ' { if ( old=="") { print }; old=$0 }' <fichier

Mais je suis intrigué par la solution sed que je
m'efforcerai à decrypter :)
Je suis sur une doc à cette adresse:
http://www.gnu.org/software/sed/manual/html_mono/sed.html

Mais peut-être que quelques phrases en français accompagnant
cette jolie ligne sed auraient facilité la tâche?

En tout cas je continue ma lecture.

Et Merci pour la belle ligne :)

A +

--
Bayrouni


--
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
Jacques L'helgoualc'h
Bayrouni a écrit, lundi 3 juillet 2006, à 17:29 :
[...]
Mais je suis intrigué par la solution sed que je
m'efforcerai à decrypter :)
Je suis sur une doc à cette adresse:
http://www.gnu.org/software/sed/manual/html_mono/sed.html



Il y a aussi http://sed.sf.net/, avec beaucoup d'exemples.

Mais peut-être que quelques phrases en français accompagnant
cette jolie ligne sed auraient facilité la tâche?



Il y en avait un peu :

sed -ne '/./{ # si une ligne est non-vide


début de bloc

p # on écrit
:a


étiquette de retour

n # puis on avale les non-vides suivantes en boucle...
/./ba


goto a (si la nouvelle ligne contient aussi quelque chose)

}'



Et Merci pour la belle ligne :)



C'était simple ! Il faut reconnaître que Awk est plus lisible.

PS. Pour les performances, on a déjà signalé que Perl était plus
performant sur les (très) gros fichiers.
--
Jacques L'helgoualc'h


--
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
Bayrouni
Jacques L'helgoualc'h a écrit :


C'était simple ! Il faut reconnaître que Awk est plus lisible.




Oui, je le reconnais, awk était plus lisible, mais après
initiation on voit plus clair en général.

J'ai lu un peu de sed dans les generalités et dans le
contexte de ma question, et je comprends maintenant bien tes
commentaires sed :)

GNU/Linux/Debian/ c'est LE MONDE PERDU, donc à decouvrir,
si je peux me permettre d'emettre une suggestion.

Cordialement.

--
Bayrouni


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