#1 Le 20/12/2010, à 14:38
- greptempo
Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Bonjour,
Je ne m'y connais pas beaucoup en programmation et j'aurais besoin
d'une aide pour le traitement d'un fichier texte.
Je dispose d'un fichier txt comportant des retours à la ligne (CR et/ou
LF, et/ou \n) et je souhaiterais concaténer/joindre toutes les lignes,
mettre une espace à chaque jonction et de garder les lignes vides
telles quelles.
-------
Exemple:
-------
--Entree.txt--
ABCDE FGH IJ
KLMNOP QRST UV
WXYZ
abcd efgh
ij klmnopq
rstuvwx yz
12345
67
8
9
--Sortie.txt--
ABCDE FGH IJ KLMNOP QRST UV WXYZ
abcd efgh
ij klmnopq rstuvwx yz
12345 67 8
9
--------
J'ai pensé que Perl pourrais permettre de réaliser ces opérations.
Je suis aussi preneur de script bash ou Vim.
Je vous remercie par avance de toute aide que vous pourrez
m'apporter.
Salutations,
Dernière modification par greptempo (Le 20/12/2010, à 14:50)
Ce sera donc du cc-by-sa
Hors ligne
#2 Le 20/12/2010, à 14:52
- coethium
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Salut, juste pour info tu n'es pas dans la bonne catégorie (trucs et astuces c'est quand toi tu proposes un truc, pas pour poser une question )
Et pour répondre à ta question : choisit un caractère qui n'apparaît pas dans ton texte (pour l'exemple je prendrais ø) :
cat ton_fichier | tr "\n" "ø" | sed s/"øø"/"\n"/g | tr "ø" " " > nouveau_fichier
Hors ligne
#3 Le 20/12/2010, à 15:16
- greptempo
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
@coethium
Merci pour la réponse rapide. Je suis susceptible d'utiliser tous les caractères (documents scientifiques et techniques), je ne peux pas me permettre d'un sacrifier un.
Navré de m'être trompé d'endroit pour poster. Si quelqu'un à le pouvoir de le déplacer, qu'il en soit remercié.
Dernière modification par greptempo (Le 20/12/2010, à 15:17)
Ce sera donc du cc-by-sa
Hors ligne
#4 Le 20/12/2010, à 20:16
- AnsuzPeorth
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Bjr,
Vite fait en python (pas de linux sous la main pour faire ça en bash)
#! /usr/bin/env python
# -*- coding:Utf-8 --*-
fe = 'chemin/du/fichier/entree'
fs = 'chemin/du/fichier/sortie'
afs = file(fs, 'a')
for ligne in file(fe ,'r'):
line = ligne.rstrip()
if not line: afs.write('\n\n')
else: afs.write( line )
afs.close() #ne devrait pas être nécessaire, mais sous windows obligatoire pour voir le résultat!
Bon, c'est pas parfait (c du vite fait), la première et la dernière ligne vide sont doublées, mais je pense pas que ce soit dramatique, si vraiment ca l'est, il sera assez simple d'y remédier !
Bien sur, comme d'habitude, ce n'est qu'une solution parmis d'autres, et le code peut surement être amélioré, mais ca fait le taf !
PS: j'ai déjà rencontré des difficultés avec la commande file sur de gros fichier, si c'est le cas, la remplacer par la commande open, et refermer les fichiers en fin de traitements.
EDIT: le plus simple, je mets une version avec open:
#! /usr/bin/env python
# -*- coding:Utf-8 --*-
fe = 'chemin/du/fichier/entree'
fs = 'chemin/du/fichier/sortie'
afs = open(fs, 'a')
rfe = open(fe ,'r')
for ligne in rfe:
line = ligne.rstrip()
if not line: afs.write('\n\n')
else: afs.write( line )
afs.close()
rfe.close()
Dernière modification par AnsuzPeorth (Le 20/12/2010, à 20:22)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#5 Le 21/12/2010, à 09:26
- greptempo
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Bonjour,
@AnsuzPeorth
Merci beaucoup, pour ton aide ! Cela répond à ma demande
Pour contribuer en proposant ma solution en une commande avec Vim en me basant sur l'algo de coethium :
:%s/\n/chaine_tempo/g | %s/chaine_tempochaine_tempo/\r\r/g | %s/chaine_tempo/ /g
Salutations,
Ce sera donc du cc-by-sa
Hors ligne
#6 Le 03/01/2011, à 10:25
- nesthib
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
pour le fun, tu peux t'inspirer de ce script en full awk qui part de mémoire sur une base similaire (recherche des lignes vides et génération d'une action sur les blocs détectés).
(bon c'est pour le fun car le script python proposé par AnsuzPeorth fait très bien et simplement son boulot)
NB. je déplace dans Dev&Prog
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#7 Le 03/01/2011, à 19:22
- ehmicky
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Salut,
Quelque chose du style :
sed 'N ; s/\([^\n]\)\n\([^\n]\)/\1 \2/g ; P ; D' FICHIER
devrait suffire. "Du style" parce que le code ci-dessus ne concatène que les premières lignes de chaque paragraphe, mais ça donne une idée en attendant que j'ai un système GNU/Linux sous la main ou que quelqu'un poste la réponse.
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#8 Le 03/01/2011, à 21:05
- pode
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Avec un uni-ligne awk (il y a un certain nombre de if (lc), pour gérer tous les cas aux limites) :
$ awk ' { if ($0 !~ /^[[:blank:]]*$/) { if (lc) { gsub(/^[[:blank:]]+/," "); }; lc=lc""$0; } else { if (lc) { print lc; }; print ""; lc=""; } } ; END { if (lc) { print lc; } } ' entree.txt
Hors ligne
#9 Le 03/01/2011, à 22:11
- ehmicky
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Une autre solution :
sed -n 'H;${g;s:\([^\n]\)\n\([^\n]\):\1 \2:g;p}' FICHIER
Ca rajoute une newline au début, à supprimer avec tail ou autre.
Mais il doit y avoir sûrement 100 fois plus simple.
Dernière modification par ehmicky (Le 04/01/2011, à 00:24)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#10 Le 04/01/2011, à 14:46
- Luc Hermitte
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Un one-liner sous vim:
%s/\S\zs\s*\n\s*\ze\S//
Dernière modification par Luc Hermitte (Le 04/01/2011, à 14:47)
Hors ligne
#11 Le 04/01/2011, à 16:04
- Totor
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
ma petite pierre à l'édifice :
awk 'BEGIN{RS="\n([ \t]*\n)+"; ORS="\n\n"} { gsub(/\n/," "); print}' <fichier>
Dernière modification par Totor (Le 05/01/2011, à 21:42)
-- Lucid Lynx --
Hors ligne
#12 Le 18/02/2011, à 23:45
- hardball
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
hello
voici la mienne
perl -0777 -pe 's#(\S)\r?\n(?![\r\n]+)#$1 #gs;s#[\n\r]+#\n\n#gs' <fichier>
Dernière modification par hardball (Le 18/02/2011, à 23:50)
-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !
Hors ligne
#13 Le 19/02/2011, à 00:54
- Ford Prefect
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Je propose ça en lisant chaque jour "man perlvar", la plus efficace des méthodes pour faire du Perl illisible et court...
perl -ne '$/="\n\n";$\=" ";s/\n//;print' fichier
OK, pas totalement propre, ça se termine par un espace et non un \n...
Hors ligne
#14 Le 19/02/2011, à 00:58
- Ford Prefect
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Pardon, je corrige:
perl -pe '$/="\n\n";$\=" ";s/\n//' fichier
Hors ligne
#15 Le 19/02/2011, à 17:07
- Ford Prefect
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
Ça prend un temps fou de lire les docs, mais ça vaut la peine:
perl -0lpe 's/(\w)\r?\n(\w)/$1 $2/g' fichier
Edit: une fin de ligne est soit \r\n, soit \n seul... Et j'économise un caractère par rapport au précédent [\r\n] !
Dernière modification par Ford Prefect (Le 23/02/2011, à 20:18)
Hors ligne
#16 Le 24/02/2011, à 00:42
- hardball
Re : Jonction de lignes fichier txt (Perl, Vim, shell etc...)
dommage, javais trouvé un truc pas mal
perl -lan000e 'print"@F\n"' <fichier>
mais ça ne fonctionne pas avec les fichiers dos...
du coup, faut le faire vite rentrer dans le rang :
perl -i.bak -pe 's/\r//g' <fichier_dos>
-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !
Hors ligne