Script awk: comment fusionner des lignes?
Résolu/Fermé
A voir également:
- Script awk: comment fusionner des lignes?
- Script vidéo youtube - Guide
- Ghost script - Télécharger - Polices de caractères
- Script bat - Guide
- Microsoft activation script - Accueil - Windows
- Executeur de script - Télécharger - Édition & Programmation
11 réponses
Une façon très simple sous awk de grouper des lignes sur une seule ligne est d'utiliser la variable RS (record separator) qui défini la fin d'une ligne.
Normalement égal à \n il suffit de l'ajouter dans l'entête du script pour regrouper les lignes voulues ensemble.
Exemple : sortir les paragraphes d'un fichier html
reste encore à les mettre sur une ligne, ce que les instructions sur les $i de awk permettent par ailleurs.
Voir aussi :
- FS, équivalent pour les champs
- regex1, regex2 qui défini un intervalle de champs ou lignes subissant le même traitement
Normalement égal à \n il suffit de l'ajouter dans l'entête du script pour regrouper les lignes voulues ensemble.
Exemple : sortir les paragraphes d'un fichier html
awk 'BEGIN {RS="</?p>"}{print $0}' page.htm
reste encore à les mettre sur une ligne, ce que les instructions sur les $i de awk permettent par ailleurs.
Voir aussi :
- FS, équivalent pour les champs
- regex1, regex2 qui défini un intervalle de champs ou lignes subissant le même traitement
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
8 mars 2008 à 10:39
8 mars 2008 à 10:39
Salut,
T'es sûre que c'est pas du "Perl" plutôt ton script ?
Tu peux nous afficher davantage de lignes de ton fichier, ou même mieux, le mettre sur Cjoint ;-))
T'es sûre que c'est pas du "Perl" plutôt ton script ?
Tu peux nous afficher davantage de lignes de ton fichier, ou même mieux, le mettre sur Cjoint ;-))
Salut jipicy!
Merci beaucoup de t'être soucié de mon problème!!
Figure-toi que mon prof vient de nous envoyer un mail disant qu'il était lui-même incapable de faire fusionner des lignes en une seule fois. Je crois donc que cette question sera à jamais irrésolue!
En outre, je ne dispose pas du corpus aujourd'hui car il est sur un serveur qui m'est inaccessible ce week-end!
La suite, lundi matin donc!
Un bon week-end à toi!
Merci beaucoup de t'être soucié de mon problème!!
Figure-toi que mon prof vient de nous envoyer un mail disant qu'il était lui-même incapable de faire fusionner des lignes en une seule fois. Je crois donc que cette question sera à jamais irrésolue!
En outre, je ne dispose pas du corpus aujourd'hui car il est sur un serveur qui m'est inaccessible ce week-end!
La suite, lundi matin donc!
Un bon week-end à toi!
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mars 2008 à 14:11
10 mars 2008 à 14:11
Le serveur est down ? ;-))
Salut jispicy!
j'étais tellement occupée ce matin à essayer de résoudre tous ces problèmes épineux que (honte sur moi) je n'ai pas pris le temps de t'en dire plus.
En fait quelqu'un m'a donné unscript qui permet bien de fusionner des lignes:
#! /usr/bin/awk -f
# cleanOO-align.awk
# nettoie
BEGIN {src = 0; trg = 0}
{if ($1 == "====================")#if line starts with +++, copy the whole line. Set src and trg to 0
{
src = 0;
trg = 0;
print $0;
next;
}
}
{if (index($0,"(src)") != 0) #if line starts with (src), check if already exists src, if no, copy whole line, if yes copy just text
{
src++;
if (src > 1)
{
print substr($0, length($1) + 1, length($0))
}
else
{
print $0
};
next;
}
}
{if (index($0, "(trg)") != 0)#if line starts with (trg), check if already exists src, if no, copy whole line, if yes copy just text
{
trg++;
if (trg > 1)
{
print substr($0, length($1) + 1, length($0))
}
else
{
print $0
};
next;
}
}
Le nouveau problème maintenant: il faut supprimer les retours à la ligne engendrés par ce script qui "ne colle pas" les 2èmes phrases aux premières, tu me suis?
En outre j'ajoute qu'on a dû aussi faire des manips à la main pour supprimer des orphelins (des src ou trg seuls), et c'est ça que ne savait pas faire mon prof.
Aurais-tu une petite idée pour supprimer ces retours à la ligne?
Je sais, j'exagère, mais on ne nous a pas appris à écrire de scripts comme celui-là!
La paradoxe est fort! (Molière) ;-)
j'étais tellement occupée ce matin à essayer de résoudre tous ces problèmes épineux que (honte sur moi) je n'ai pas pris le temps de t'en dire plus.
En fait quelqu'un m'a donné unscript qui permet bien de fusionner des lignes:
#! /usr/bin/awk -f
# cleanOO-align.awk
# nettoie
BEGIN {src = 0; trg = 0}
{if ($1 == "====================")#if line starts with +++, copy the whole line. Set src and trg to 0
{
src = 0;
trg = 0;
print $0;
next;
}
}
{if (index($0,"(src)") != 0) #if line starts with (src), check if already exists src, if no, copy whole line, if yes copy just text
{
src++;
if (src > 1)
{
print substr($0, length($1) + 1, length($0))
}
else
{
print $0
};
next;
}
}
{if (index($0, "(trg)") != 0)#if line starts with (trg), check if already exists src, if no, copy whole line, if yes copy just text
{
trg++;
if (trg > 1)
{
print substr($0, length($1) + 1, length($0))
}
else
{
print $0
};
next;
}
}
Le nouveau problème maintenant: il faut supprimer les retours à la ligne engendrés par ce script qui "ne colle pas" les 2èmes phrases aux premières, tu me suis?
En outre j'ajoute qu'on a dû aussi faire des manips à la main pour supprimer des orphelins (des src ou trg seuls), et c'est ça que ne savait pas faire mon prof.
Aurais-tu une petite idée pour supprimer ces retours à la ligne?
Je sais, j'exagère, mais on ne nous a pas appris à écrire de scripts comme celui-là!
La paradoxe est fort! (Molière) ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mars 2008 à 14:48
10 mars 2008 à 14:48
Euh...j'ai peut être une solution mais avec "sed" et non "awk", c'est grave ?
Et le fichier, je peux en avoir un plus gros extrait ???
;-)
Et le fichier, je peux en avoir un plus gros extrait ???
;-)
Pas de problème avec sed, de toute façon, au point où j'en suis!
Voici mon fichier: https://www.cjoint.com/?dkoYYFN7R3
Merci infiniment jipicy!!
Voici mon fichier: https://www.cjoint.com/?dkoYYFN7R3
Merci infiniment jipicy!!
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mars 2008 à 15:07
10 mars 2008 à 15:07
[tmpfs]$ sed '/^(trg)/{N;/\n==*/! s/\n//}' OO-enfr-E_ENFR-v3.txt > temp.txt [tmpfs]$ sed '/^(src/{N;/\n(trg)/! s/\n//}' temp.txt > final.txt;-))
Alors là un grand merci et un grand bravo! Ca marche!!
Une dernière petite question: à quoi correspond le N?
Promis, après, je ne t'embête plus (enfin j'espère).
;-)
Une dernière petite question: à quoi correspond le N?
Promis, après, je ne t'embête plus (enfin j'espère).
;-)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mars 2008 à 15:44
10 mars 2008 à 15:44
Tiens voilà le script dans un fichier et qui traite tout d'un coup, avec commentaires :
Donc à enregistrer dans un fichier (par exemple "script.sed") et à appeler de cette façon :
/^(src)/{ # Si la ligne commencent par N # Ajouter la ligne suivante dans l'espace de travail /\n(trg)/{ # Si le caractère saut de ligne (\n) est suivi de "(trg) P # Afficher la 1ère partie de l'espace de travail (jusqu'au saut de ligne) D # Effacer la 1ère partie de l'espace de travail (jusqu'au saut de ligne) b trg # Et se brancher à l'étiquette "trg" } /\n(src)/!{ # Si le caractère saut de ligne (\n) n'est pas suivi de "(src)" s/\n// # supprimer le caractère saut de ligne (\n) } } :trg # Étiquette /^(trg)/{ # Si la ligne commencent par N # Ajouter la ligne suivante dans l'espace de travail /\n==*/!{ # Si le caractère saut de ligne (\n) n'est pas suivi par des "=" s/\n// # supprimer le caractère saut de ligne (\n) } }
Donc à enregistrer dans un fichier (par exemple "script.sed") et à appeler de cette façon :
sed -f script.sed OO-enfr-E_ENFR-v3.txt > final.txtSi tu as une version de "sed" supérieure à 4.0.5, tu peux éditer directement le fichier original (en faisant une sauvegarde toutefois) de cette façon :
sed -f script.sed -i.BAK OO-enfr-E_ENFR-v3.txt;-))
Alors là!!!
Je ne sais pas comment te remercier!
Toutes ces précisions si claires!
J'ai fini ma tâche pour aujourd'hui, mais il se peut très bien que je fasse encore appel à toi dans les jours à venir!
Encore merci pour ta patience et bravo pour ta pédagogie!
Je ne sais pas comment te remercier!
Toutes ces précisions si claires!
J'ai fini ma tâche pour aujourd'hui, mais il se peut très bien que je fasse encore appel à toi dans les jours à venir!
Encore merci pour ta patience et bravo pour ta pédagogie!
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mars 2008 à 17:39
10 mars 2008 à 17:39
De rien ;-))