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é ...
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'
C'est ici. C'est une autre solution simple et facile.
echo $(cat Input.txt) > Output.txt
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!
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:
N
ajoute la ligne suivante à l'espace de modèle (multiligne), qui contient déjà la ligne en cours;s/\n/ /
remplace le caractère de nouvelle ligne \n
généré par N
par un espace;ta
va à la ligne de script après l’étiquette :a
tant 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, maiss/\n/ /
(en principe exécuté sur n'importe quelle ligne) réussit sur n'importe quelle ligne sauf la dernière, doncta
rend la fin du script accessible niquement lorsque la dernière ligne d'entrée est lue (la seule ligne où s
échoue), doncp
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 p
rint 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.
Je pense que le moyen le plus simple de le faire est:
paste -s -d:" " test.txt
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.
Essaye ça
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/
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
vim <your_file>
Tapez dans vim et appuyez sur Entrée:
:% s/\n/ /g
Solution pure bash:
while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
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.
Si c’était moi, je l’ouvrirais dans vim et appuyerais sur Shift+J parfois.