#1 Le 16/05/2018, à 09:30
- delkadir
[bash] isoler un bloc de texte en fonction de sa "mise en page"
Tout d'abord, bonjour et merci d'avance pour votre aide.
Voici mon problème. J'ai des résultats de simulation dans un fichier texte qui se présente sous cette forme
1000000 128 304500
1 0.25 0.00271111 5.26218e-05 5.29514e-06
2 0.75 0.00318889 7.03906e-05 6.2283e-06
3 1.25 0.00327778 6.74398e-05 6.40191e-06
4 1.75 0.00326667 6.36219e-05 6.38021e-06
5 2.25 0.00314444 5.782e-05 6.14149e-06
6 2.75 0.00331111 6.70086e-05 6.46701e-06
7 3.25 0.0023 3.99329e-05 4.49219e-06
8 3.75 0.00218889 3.90295e-05 4.27517e-06
9 4.25 0.00244444 5.44511e-05 4.77431e-06
10 4.75 0.00321111 6.07391e-05 6.2717e-06
Le fichier se présente donc sous forme de blocs de cette forme. Et je voudrais en extraire juste le dernier bloc. Le problème est que la longueur des blocs est variable et je ne peux pas donc utiliser le nombre de lignes comme critère. J'ai trouvé une solution dans le cas où mon dernier bloc est le 1 00 000ème (c'est ce que j'ai le plus souvent)
debut=$(($(sed -n '/1000000/=' profile.density_equilibre)+1))
fin=$(sed -n '$=' profile.density_equilibre )
Cependant j'ai également des fichier qui contiennent moins ou plus de blocs et je voudrais utiliser le fait que chaque bloc commence par une ligne sans espace comme critère. J'ai pensé à faire un compteur qui compterai le nombre de lignes commençant sans espace mais ensuite je ne vois pas vraiment que faire de cette information. Je vous avoue que je suis un peu perdu...
Merci d'avoir pris le temps de me lire, j’espère avoir été compréhensible.
Dernière modification par delkadir (Le 16/05/2018, à 09:31)
Hors ligne
#2 Le 16/05/2018, à 10:27
- Watael
Re : [bash] isoler un bloc de texte en fonction de sa "mise en page"
salut,
qu'est-ce qui différencie, au niveau de leur format, les données que tu veux garder de celles que tu ne veux pas garder ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 16/05/2018, à 10:27
- delkadir
Re : [bash] isoler un bloc de texte en fonction de sa "mise en page"
J'ai trouvé une solution. Ce n'est sûrement pas optimal mais ça marche. Je la mets ici, on sait jamais si quelqu'un a un jour le même soucis.
J'extrais toutes les lignes ne commençant pas par un espace dans un fichier (lignes.txt) puis je mets dans une variable le 1er "mot" de la dernière ligne de ce fichier. C'est cette variable qui sert ensuite de repère pour trouver le début du dernier bloc.
grep "[ ]\{0\}" profile.density_equilibre | awk '$0 !~ /^ / {print $1}' > lignes.txt
delimiteur=$(awk 'END {print}' lignes.txt)
debut=$(($(sed -n "/$delimiteur/=" profile.density_equilibre)+1))
fin=$(sed -n '$=' profile.density_equilibre )
rm lignes.txt
Vraiment désolé pour la création du sujet du coup qui n'était pas forcement utile.
Hors ligne
#4 Le 16/05/2018, à 11:07
- pingouinux
Re : [bash] isoler un bloc de texte en fonction de sa "mise en page"
Bonjour,
Tu peux obtenir les numéros des lignes extrêmes du dernier bloc ainsi :
awk '$0~"^$" {der_lig_vid=NR} END{print der_lig_vid+2, NR}' profile.density_equilibre
Hors ligne
#5 Le 16/05/2018, à 11:30
- Watael
Re : [bash] isoler un bloc de texte en fonction de sa "mise en page"
echo '123
123
123
234
234
234
345
345
345' | sed -n '/^[0-9]/h; /^ /H; ${g;p}'
345
345
345
à chaque fois qu'on rencontre le motif de début de bloc, on écrase le tampon, et on ajoute les lignes qui correspondent aux autres données...
Dernière modification par Watael (Le 16/05/2018, à 11:34)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 16/05/2018, à 13:35
- delkadir
Re : [bash] isoler un bloc de texte en fonction de sa "mise en page"
Merci pour vos réponses. Je vais tester tout ça
Hors ligne