[SH] Récupérer lignes fichiers texte

Résolu/Fermé
ZZ2F3 Messages postés 40 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 30 juin 2009 - 20 août 2008 à 16:51
ZZ2F3 Messages postés 40 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 30 juin 2009 - 21 août 2008 à 13:23
Bonjour,

J'ai un fichier texte de la forme
ligne1
ligne2
ligne3
ligne4

test1
Queue
test2
Queue
test3
Queue
test4
Queue
test5
Queue
test6
Queue
test7
Queue
test8
Queue
test9
Queue
test10


Je travaille en Bash et je voudrais par exemple à partir de ce fichier créer 3 fichiers de la forme :

ligne1
ligne2
ligne3
ligne4

test1
Queue
test2
Queue
test3
Queue
test4
Queue

****

ligne1
ligne2
ligne3
ligne4

test5
Queue
test6
Queue
test7
Queue
test8
Queue

****

ligne1
ligne2
ligne3
ligne4

test9
Queue
test10
Queue

****

J'ai pensé à utiliser sed mais je ne trouve pas la syntaxe pour récupérer les lignes comprises entre i et j.
Je suis sur que la solution est archi simple et c'est pour cela que je vous remercie par avance!

Bonne fin de journée!
A voir également:

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 août 2008 à 17:04
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
20 août 2008 à 17:04
Et avec une combinaison de head et tail ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 août 2008 à 17:10
Non ça ne peut pas marcher. Il veut récupérer aussi des instructions en pleins milieu, ce que ne fait ni head ni tail.
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
20 août 2008 à 17:13
Ben si.
Exemple :
Fichier de 20 lignes
head prend les ligne 0 à 15
on fait un tail sur le resultat qui prend les lignes 9 à la fin, c'est à dire 15
on a donc les lignes 9 à 15 du fichier d'origine.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 août 2008 à 17:21
Oui. Tu fais donc ce que sed peut faire en une instruction. Pratique
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
20 août 2008 à 17:25
ah bon, ben en fait je connais pas sed.
Mais si la syntaxe est compliquée, celle de head et tail est simple au possible...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 août 2008 à 17:39
 sed 'a,b !d' fichier
affiche sur la sortie standard les lignes 4, 5 et 6.
 head -n b fichier | tail -n $((b-a+1)) 
pour le même résultat ;)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 août 2008 à 17:47
Salut,

Une façon de faire :
[tmpfs]$ ls -1
fich.txt
foo.sh*

[tmpfs]$ cat fich.txt
ligne1
ligne2
ligne3
ligne4

test1
Queue
test2
Queue
test3
Queue
test4
Queue
test5
Queue
test6
Queue
test7
Queue
test8
Queue
test9
Queue
test10
Queue

[tmpfs]$ cat foo.sh
#! /bin/bash

#set -xv

var=$(sed -n 1,4p fich.txt)

n=1
i=1
j=4
fin=$(sed -n '/test/p' fich.txt | wc -l)

while [ "$i" -le "$fin" ]
do
echo -e "${var}\n" > new_fich"${n}".txt
sed -n "/test$i/,/test$j/ {N;p}" < fich.txt >> new_fich"${n}".txt
((n++))
((i+=4))
((j+=4))
done

[tmpfs]$ ./foo.sh

[tmpfs]$ ls -1
fich.txt
foo.sh*
new_fich1.txt
new_fich2.txt
new_fich3.txt

[tmpfs]$ cat new_fich1.txt
ligne1
ligne2
ligne3
ligne4

test1
Queue
test2
Queue
test3
Queue
test4
Queue
test10
Queue
[tmpfs]$ cat new_fich2.txt
ligne1
ligne2
ligne3
ligne4

test5
Queue
test6
Queue
test7
Queue
test8
Queue
[tmpfs]$ cat new_fich3.txt
ligne1
ligne2
ligne3
ligne4

test9
Queue
test10
Queue
[tmpfs]$
;-))
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 août 2008 à 20:36
Oups ;-((

Il faut remplacer la ligne :
sed -n "/test$i/,/test$j/ {N;p}" < fich.txt >> new_fich"${n}".txt
par
sed -n "/test$i\b/,/test$j\b/ {N;p}" < fich.txt >> new_fich"${n}".txt
;-))
0
ZZ2F3 Messages postés 40 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 30 juin 2009
21 août 2008 à 13:23
Merci à tout le monde!

J'ai fait un mix de tout ce que vous m'avez conseillé et j'arrive à un truc qui fonctionne!

En tous cas, merci pour votre rapidité et votre efficacité ;)

Bonne fin de journée!
0