web-dev-qa-db-fra.com

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

Je veux obtenir toutes les lignes d'un texte en une seule ligne. Je suis un débutant en codage en essayant d'apprendre par la pratique. 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 monfichier.txt #utput tout foiré et je ne peux pas faire la tête ni la queue de la syntaxe 
 
 cat myfile.txt | tr -d '\ n'> myfile.txt # Supprime toutes les lignes 

Voici le fichier texte:

 500212 
 262578-4-4 
 23200 
 GRIFFITH LABORATORIES LTD 
 GRIFFITH LABORATORIES 
 CONSEIL DU COMTÉ DE DUBLIN SUD 
 BUREAU 
 BUREAU (INDUSTRIEL) 
 Liste chiffrable 
 2 Zone industrielle de Pineview 
 Chemin Firhouse 
 Knocklyon 
 31 déc. 2007 
 01 janv. 2008 "

Je n'arrive pas à comprendre où je me suis trompé ...

28
John

tr tel que vous l'avez utilisé devrait fonctionner et est le plus simple - il vous suffit juste de sortie 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é.

chat monfichier.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'
30
ish

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

echo $(cat Input.txt) > Output.txt
8
αғsнιη

METHODE SIMPLE

Une autre méthode utilisant awk,

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

Sortie:

500212262578-4-423200GRIFFITH LABORATORIES LTDGREFFITH LABORATORIESSOUTH DU COMTE DE DUBLIN COUNCILOFFICEOFFICE (INDUSTRIAL) Liste Rateable2 Domaine industriel de PineviewFirhouse RoadKnocklyon31 déc. 200701 janv. 2008 "

Note:

ORS = '' -> Ceci est votre séparateur de champs. Vous pouvez insérer n'importe quel caractère entre les guillemets simples comme séparateur de champs. En utilisant cette méthode awk, nous pouvons inclure des espaces et tous les caractères.

J'espère que cela pourrait aider!

3
M.S.Arun

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

En améliorant d’autres réponses, on obtient

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

Ce qui est plus clair si é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 modèle (multiligne), qui contient déjà la ligne en cours;
  2. s/\n/ / remplace le caractère de nouvelle ligne \n généré par N par un espace;
  3. ta va à la ligne de script après l’étiquette :atant que la substitution à l’étape 2 a réussi, , c’est-à-dire si la substitution L’exécution passe à l’étape 1 sans "frapper" la fin du script, , c’est-à-dire sans en lisant une autre ligne d’entrée.

Notez ce qui suit.

  • sed lit les lignes du fichier d’entrée une par une dans l’ordre, à partir de la 1ère ligne;
  • :a est simplement 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 sauf la dernière, donc
  • ta rend la fin du script accessible niquement 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 modèle après le 1 er, sauf si le dernier est lu, mais il n'y a pas d'autre ligne à lire et la commande implicite p est exécutée.

Ainsi, le script lit essentiellement dans la 1ère ligne de la saisie et continue d’ajouter les lignes suivantes une par une, en substituant à chaque fois la nouvelle ligne par un espace; après que dernière ligne ait été ajouté (et \n changé dans un espace), N ne peut pas ajouter de ligne, s échoue, ta est ignoré, la fin du script est atteinte et l'instruction implicite print s’exécute sur l’espace looongle actuel du motif d’une ligne.

L'option -i substitue le fichier d'entrée file avec tout l'espace de modèle d'une ligne.

3

Je pense que le moyen le plus simple de le faire est:

paste -s -d:" " test.txt

http://ss64.com/bash/paste.html

2
JConstenla

GEDIT:

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

Voir la capture d'écran ci-dessous:

Votre texte original est sur les lignes 1-14.
Le résultat est affiché à la ligne 16.

enter image description here

2
Parto

Essaye ça

sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/

1
Anand Rajasekar

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  
0
Sergiy Kolodyazhnyy
vim <your_file>

Tapez dans vim et appuyez sur Entrée:

:% s/\n/ /g
0
Anatoly

Solution pure bash:

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

Je pense que vous oubliez simplement que vous devez 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 uniquement si les fichiers que vous essayez de fusionner ne sont pas trop volumineux pour les mémoires tampons de sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Nous remercions n autre forum ici , où ils discutent des capacités de sed. J'ai testé la commande et cela a fonctionné pour moi.

0
user76204

Si c’était moi, je l’ouvrirais dans vim et appuyerais sur Shift+J parfois.

0
thomasrutter