web-dev-qa-db-fra.com

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

Je dois 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 more a l'option +n pour 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 supprimer la ligne, mais existe-t-il un moyen simple de le faire depuis la ligne de commande?

122
James
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
132
ghostdog74

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

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

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

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

61
Raj More

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

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

21
John Faughnan

Utilisez la commande FOR pour afficher un fichier ligne par ligne et avec l'option "ignorer" pour manquer plusieurs lignes de départ ...

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

Vous pouvez rediriger la sortie d'un fichier de commandes 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 de traitement par lots.

6
Alberto Rossini

Je mettrais cela dans un commentaire à ghostdog74, sauf que mon représentant est trop bas, alors allez-y .

more +2 file2.txt > temp
Ce code ignorera 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 (probablement la même ligne d'en-tête) du deuxième fichier. Par conséquent, pour exclure uniquement la ligne d'en-tête, OP devrait utiliser more +1.

type temp file1.txt > out.txt

On ne sait pas quel ordre résulte de ce code. Est-ce que temp est ajouté à file1.txt (comme vous le souhaitez) ou file1.txt est ajouté à temp (non souhaité car la ligne d'en-tête serait enterrée au milieu du fichier résultant) .

En outre, ces opérations prennent très longtemps avec des fichiers volumineux (par exemple 300 Mo)

3
Brian D

Voici comment faire ceci:

(type file1.txt && more +1 file2.txt) > out.txt
2
Waldo

Je sais que vous avez dit que vous ne pouviez installer aucun logiciel, mais je ne suis pas certain de la sévérité de cette restriction. Quoi qu'il en soit, j'avais le même problème (essayer de concaténer deux fichiers avec probablement les mêmes en-têtes) et je pensais pouvoir fournir une réponse alternative aux autres utilisateurs de cette page, car cela fonctionnait parfaitement pour moi.

Après avoir essayé un tas de commandes dans Windows et été gravement frustré, ainsi que toutes sortes d'éditeurs graphiques qui promettaient d'ouvrir des fichiers volumineux, mais qui ne le pouvaient pas, j'ai finalement retrouvé mes racines Linux et ouvert Cygwin. Rapide. Deux commandes:

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

Pour file1.csv 800 Mo et file2.csv 400 Mo, ces deux commandes ont pris moins de 5 secondes sur ma machine. Dans l'invite de Cygwin, pas moins. Je pensais que les commandes Linux étaient censées être lentes sous Cygwin, mais cette approche demandait beaucoup moins d'effort et était bien plus simple que n'importe quelle approche Windows que je pouvais trouver.

2
Andrew Mao

En PowerShell:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
1
JaR

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 un saut de ligne à la fin du premier fichier, vous pouvez essayer la commande suivante avant l'ajout.

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

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

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

copy abc*.txt xyz.txt
0
GaTechThomas