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 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 wink)

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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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