Concaténer les fichiers texte avec la ligne de commande Windows, en supprimant les lignes de début

127

J'ai besoin de concaténer des fichiers texte relativement volumineux et je préférerais le faire via la ligne de commande. Malheureusement, je n'ai que Windows et je ne peux pas installer de nouveau logiciel.

type file1.txt file2.txt > out.txt

me permet presque d'obtenir ce que je veux, mais je ne veux pas que la 1ère ligne de file2.txt soit incluse dans out.txt.

J'ai remarqué que cela morea la +npossibilité de spécifier une ligne de départ, mais je n'ai pas réussi à les combiner pour obtenir le résultat souhaité. Je suis conscient que cela peut ne pas être possible sous Windows, et je peux toujours éditer out.txt à la main pour me débarrasser de la ligne, mais y a-t-il un moyen simple de le faire à partir de la ligne de commande?

James
la source

Réponses:

136
more +2 file2.txt > temp
type temp file1.txt > out.txt

ou vous pouvez utiliser copy. Voir copy /?pour plus.

copy /b temp+file1.txt  out.txt
ghostdog74
la source
4
Bien sûr! J'aurais préféré éviter l'utilisation de fichiers temporaires. J'ai essayé d'utiliser des parenthèses, des tuyaux et <pour le placer dans une seule commande, mais je n'ai pu aller nulle part. La copycommande est beaucoup plus rapide, mais elle met un caractère SUB à la fin. Y a-t-il un moyen d'éviter cela?
James
18
J'ajouterais que si vous souhaitez concaténer TOUS les fichiers, vous pouvez le faire copy /b *.txt combined.txtsans avoir à répertorier les fichiers individuellement.
Phlucious
1
plus apparemment convertir l'onglet en espaces, dommage!
Antonio
existe-t-il une commande pour récupérer les fichiers originaux à partir des fichiers fusionnés?
swapnil gandhi
3
@ ghostdog74: Je pense qu'il faut type file1.txt temp > out.txtréellement ajouter le deuxième fichier, sans en-tête au premier
Marius
61

J'utilise ça, et ça marche bien pour moi:

TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

Bien sûr, avant chaque course, vous devez DELETE C:\Folder\ConcatenatedFile.csv

Le seul problème est que si tous les fichiers ont des en-têtes, ils seront répétés dans tous les fichiers.

Raj Plus
la source
2
Lorsque j'entre un nom de fichier pour le fichier concaténé, ce qui signifie qu'il est répertorié à la fin des fichiers dans le loaction (ordre alphabétique), alors les fenêtres semblent concaténer deux fois! J'ai fini par utiliser un nom de fichier de 1filename.csv pour ne pas avoir le problème. Je suppose que la concaténation dans un dossier différent devrait également fonctionner ...
SebK
1
Si vous utilisez> au lieu de >>, vous n'avez pas à supprimer le fichier au préalable. > redirige la sortie et crée le fichier à chaque fois. >> redirige la sortie et les ajoute.
Eddie Deyo
1
Comment cela saute-t-il la première ligne du fichier 2, que l'OP a demandé?
Dan Dascalescu
1
Il ne saute pas la première ligne du fichier2. J'ai manqué cette partie de la question.
Raj More
1
existe-t-il une commande pour récupérer les fichiers originaux à partir des fichiers fusionnés?
swapnil gandhi
21

Je n'ai pas assez de points de réputation pour commenter la recommandation à utiliser *.csv >> ConcatenatedFile.csv, mais je peux ajouter un avertissement:

Si vous créez un ConcatenatedFile.csvfichier dans le même répertoire que celui que vous utilisez pour la concaténation, il sera ajouté à lui-même.

John Faughnan
la source
2
Comment cela saute-t-il la première ligne du fichier 2, que l'OP a demandé?
Dan Dascalescu
6

Utilisez la commande FOR pour faire écho à un fichier ligne par ligne, et avec l'option 'skip' pour manquer un certain nombre de lignes de départ ...

FOR /F "skip=1" %i in (file2.txt) do @echo %i

Vous pouvez rediriger la sortie d'un fichier batch, contenant quelque chose comme ...

FOR /F %%i in (file1.txt) do @echo %%i
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i

Notez le double% lorsqu'une variable FOR est utilisée dans un fichier batch.

Alberto Rossini
la source
4

Voici comment procéder:

(type file1.txt && more +1 file2.txt) > out.txt
Waldo
la source
3

Je mettrais cela dans un commentaire à ghostdog74, sauf que mon représentant est trop faible, alors voilà.

more +2 file2.txt > temp
Ce code ignorera en fait les lignes 1 et 2 du fichier. OP veut conserver toutes les lignes du premier fichier (pour conserver la ligne d'en-tête), puis exclure la première ligne (vraisemblablement la même ligne d'en-tête) sur le deuxième fichier, afin d'exclure uniquement la ligne d'en-tête OP doit utiliser more +1.

type temp file1.txt > out.txt

On ne sait pas quel ordre résulte de ce code. Est tempajouté à file1.txt(comme souhaité), ou est file1.txtajouté à temp(indésirable car la ligne d'en-tête serait enterrée au milieu du fichier résultant).

De plus, ces opérations prennent VRAIMENT LONGTEMPS avec des fichiers volumineux (par exemple 300 Mo)

Brian D
la source
2

Je sais que vous avez dit que vous ne pouviez installer aucun logiciel, mais je ne sais pas à quel point cette restriction est stricte. Quoi qu'il en soit, j'ai eu le même problème (essayer de concaténer deux fichiers avec vraisemblablement les mêmes en-têtes) et j'ai pensé que je fournirais une réponse alternative pour les autres qui arrivent sur cette page, car cela fonctionnait très bien pour moi.

Après avoir essayé tout un tas de commandes dans Windows et été gravement frustré, et également essayé toutes sortes d'éditeurs graphiques qui promettaient de pouvoir ouvrir de gros fichiers, mais que je ne pouvais pas, je suis finalement revenu à mes racines Linux et j'ai ouvert mon Cygwin rapide. Deux commandes:

cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv

Pour file1.csv800 Mo et file2.csv400 Mo , ces deux commandes ont pris moins de 5 secondes sur ma machine. Dans une invite Cygwin, rien de moins. Je pensais que les commandes Linux étaient censées être lentes dans Cygwin mais cette approche demandait beaucoup moins d'efforts et était bien plus facile que n'importe quelle approche Windows que je pouvais trouver.

Andrew Mao
la source
1

Dans PowerShell:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
Pot
la source
0

Vous pouvez aussi simplement essayer ceci

type file2.txt >> file1.txt

Il ajoutera le contenu de file2.txt à la fin de file1.txt

Si vous avez besoin du fichier original 1.txt, effectuez une sauvegarde au préalable. Ou tu peux faire ça

type file1.txt > out.txt
type file2.txt >> out.txt

Si vous souhaitez avoir un saut de ligne à la fin du premier fichier, vous pouvez essayer la commande suivante avant d'ajouter.

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt
Hamed
la source
0

L'aide de copyexplique que les caractères génériques peuvent être utilisés pour concaténer plusieurs fichiers en un seul.

Par exemple, pour copier tous les fichiers .txt du dossier actuel commençant par "abc" dans un seul fichier nommé xyz.txt:

copy abc*.txt xyz.txt
GaTechThomas
la source
-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt
Wujin
la source
-1

Cela prend Test.txtavec les en-têtes et ajoute Test1.txtet Test2.txtécrit les résultats dans le Testresult.txtfichier après avoir enlevé les en-têtes des deuxième et troisième fichiers respectivement:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
utilisateur10301222
la source