Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

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

Hors ligne