Comment combiner toutes les lignes d'un fichier texte en une seule ligne?


28

Je veux mettre toutes les lignes d'un texte sur une seule ligne. Je suis un débutant en codage essayant d'apprendre en faisant. J'ai passé quatre heures à essayer de résoudre ce problème. Je sais qu'il existe une solution simple à ce problème. Voici ce que j'ai essayé.

sed -e 'N; s / \ n //' monfichier.txt #Ne fait rien

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt #output tout foiré et je ne peux pas faire la tête ni la queue de la syntaxe

cat myfile.txt | tr -d '\ n'> monfichier.txt # Supprime toutes les lignes

Voici le fichier texte:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
LABORATOIRES DE GRIFFITH
CONSEIL DU COMTÉ DU SUD DUBLIN
BUREAU
BUREAU (INDUSTRIEL)
Liste évaluable
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 déc. 2007
01 janv. 2008 "   

Je ne peux pas comprendre où je me suis trompé ...

Réponses:


31

trcomme vous l'avez utilisé, il devrait fonctionner et est le plus simple - il vous suffit de sortir dans un autre fichier . Si vous utilisez le fichier d'entrée en sortie, le résultat est un fichier vide comme vous l'avez observé;

cat myfile.txt | tr -d '\ n'> oneline.txt

Vous devez vous rappeler que certains éditeurs terminent une ligne avec \r\n. Dans ce cas, utilisez

cat myfile | tr -d '\r\n'

Merci pour votre aide mais cela ne fonctionne toujours pas. Je sais que c'est quelque chose de simple et de simple. La commande que vous avez donnée a supprimé toutes les lignes. Je vais publier le dossier 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES SOUTH DUBLIN COUNTY COUNCIL OFFICE OFFICE (INDUSTRIAL) Listable 2 Pineview Industrial Estate Firhouse Road Knocklyon 31 déc. 2007 01 janv. 2008
John

@JOhn: Quel est le résultat ou l'erreur?
ish

J'allais poster en modifiant ma réponse. Après avoir utilisé la commande, le fichier était vide. Il ressemblait à ceci dans le terminal "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Merci encore.
John

@John: Vous ne pouvez pas utiliser le même nom de fichier de sortie !! (voir la réponse). S'il vous plaît essayezcat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
Une meilleure façon de le faire serait tr -d '\n' <input.txt > output.txt- qui évite l'utilisation inutile de chat et utilise un tuyau inutile de moins.
evilsoup

8

C'est ici. C'est une autre solution simple et simple.

echo $(cat Input.txt) > Output.txt

2
je ne peux pas croire que cela a fonctionné, génial
mchid

echo `cat Input.txt` > Output.txt fonctionne aussi, juste une autre variante
raider33

S'il y a PLUS D'UN espace blanc (espace, tabulation, nouvelle ligne et ainsi de suite) dans une seule division, ils seront remplacés par un espace.
iBug

C'est une bonne solution, mais sur mon ordinateur, j'ai trouvé qu'il fallait environ trois fois plus de temps pour fonctionner que la trsolution.
LS

4

MÉTHODE SIMPLE

Une autre méthode utilisant awk,

cat myfile.txt | awk '{print}' ORS=''

Sortie:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) List Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 déc. 200701 jan 2008 "

Remarque:

ORS = '' -> ORS (Output Record Separator). (c'est-à-dire) votre séparateur de champ, vous pouvez avoir n'importe quel caractère entre les guillemets simples comme séparateur de champ. En utilisant cette méthode awk, nous pouvons inclure des espaces et tous les caractères.

J'espère que cela pourrait aider!


1
ORS est le séparateur d'enregistrement de sortie. OFS est le séparateur de champ de sortie. Voir thegeekstuff.com/2010/01/… ouman awk
Elder Geek

3

Il n'est pas nécessaire de mettre l'étiquette en :adehors de l'instruction principale, ni l' -eoption nécessaire nécessaire; enfin, le /$/est superflu (chaque ligne a un caractère EOL).

Améliorer les autres réponses, on obtient

sed -i ':a; N; s/\n/ /; ta' file

Ce qui est plus clair s'il est écrit comme suit,

sed -i ':a
        N
        s/\n/ /
        ta' file

La commande fonctionne comme suit:

  1. N ajoute la ligne suivante à l'espace de motif (multiligne), qui contient déjà la ligne actuelle;
  2. s/\n/ /remplacer le caractère de nouvelle ligne \ngénéré par Npar un espace ;
  3. tava à la ligne de script suivant l'étiquette :a tant que la substitution à l'étape 2 a réussi , c'est-à - dire que si la substitution a eu lieu, l'exécution passe à l'étape 1 sans "frapper" la fin du script, c'est-à - dire sans lire une autre ligne d'entrée.

Notez ce qui suit;

  • sedlit les lignes du fichier d'entrée une par une dans l'ordre, à partir de la 1ère ligne ;
  • :a n'est qu'une étiquette, pas une commande à exécuter;
  • N est, en principe, exécuté sur n'importe quelle ligne, mais
  • s/\n/ /(en principe exécuté sur n'importe quelle ligne) réussit sur n'importe quelle ligne mais la dernière , donc
  • tarend la fin du script accessible uniquement lorsque la dernière ligne d'entrée est lue (la seule ligne où séchoue), donc
  • aucune autre ligne d'entrée n'est lue dans l'espace de motif après que la 1ère y ait été lue, à moins que la dernière ne soit lue, mais alors il n'y a plus de ligne à lire et la pcommande implicite est exécutée.

Ainsi, le script lit essentiellement la 1ère ligne d'entrée et continue d'ajouter les lignes suivantes une par une, en remplaçant à chaque fois la nouvelle ligne par un espace; après que la dernière ligne est ajoutée (et \nmodifiée dans un espace), Nne peut pas ajouter de ligne, séchoue, taest ignorée, la fin du script est atteinte et l' pinstruction rint implicite est exécutée sur l'espace de motif looong 1 ligne actuel .

L' -ioption remplace le fichier d'entrée filepar tout l'espace de motif 1 ligne.


2

GEDIT:

Rechercher et remplacer \npar un espace ''.
Vous pouvez obtenir la fenêtre de remplacement en allant dans 'Rechercher' -> 'Remplacer'
ou via le raccourci clavier Ctrl+H

Voir capture d'écran ci-dessous:

Votre texte d'origine est sur les lignes 1-14.
Le résultat est à la ligne 16.

entrez la description de l'image ici




0

Je pense que vous oubliez simplement que vous deviez dire à sed de rediriger la sortie de yourfile.txt vers le résultat souhaité, newfile.txt. Cela semble être la commande dont vous avez besoin, mais seulement si les fichiers que vous essayez de fusion ne sont pas trop grand pour les tampons de sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Nous remercions un autre forum ici , où ils discutent des capacités de sed. J'ai testé la commande et cela a fonctionné pour moi.


1
En fait, sed avec le -icommutateur modifiera le fichier d'origine en ligne , il n'est donc pas nécessaire de sortir vers un autre fichier. Attention cependant!
ish

J'ai essayé sed -e: a -e N -e's / \ n / / '-e ta reval_details.asp? Pno = 500214.txt 01 janvier 2008addustrial Estate sed -i: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: impossible de trouver une étiquette pour passer à a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to un' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: impossible de lire s / \ n / /: Aucun fichier ou répertoire de ce type #Any ideas.
John

@Mik Je n'ai toujours pas eu de chance mais merci pour la réponse.
John

J'ai copié et collé votre texte dans un éditeur de texte et enregistré le fichier, puis utilisé ma commande sed et il a tout fait apparaître sur une seule ligne lorsqu'il est ouvert dans nano; cependant, si vous ouvrez le fichier en utilisant cat dans le terminal, il sera encapsulé et ne semblera pas être une seule ligne, alors c'est peut-être ce qui se passe. De plus, vous n'avez pas besoin d'un 'avant sed et je pense que vous avez ajouté d'autres éléments inutiles à la commande ci-dessus, alors essayez sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt La ligne est si longue qu'elle apparaîtra à l'écran, cependant, à moins que vous n'ayez un moniteur de 30 pouces et plus!

@Mik Cheers pour le poste. J'ai tapé mes données dans un éditeur de texte, les ai enregistrées et j'ai exécuté 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' et cela a fonctionné. à la perfection. Alléluia. J'ai ensuite tapé 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' et chaque ligne à part la première avait un espace ajouté au début de la ligne. J'apprécie l'effort que vous mettez mais je pense que je vais passer à l'octave et essayer de traiter les données là-bas.
John

0

Solution pure bash:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt

0

Si c'était moi, je l'ouvrirais simplement dans vim et appuierais sur Shift+ Jplusieurs fois.


0
vim <your_file>

Tapez dans vim et appuyez sur Entrée:

:% s/\n/ /g

0

Approche Python:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.