Połącz pliki tekstowe za pomocą wiersza poleceń systemu Windows, pomijając wiodące linie

129

Muszę połączyć kilka stosunkowo dużych plików tekstowych i wolałbym to zrobić za pomocą wiersza poleceń. Niestety mam tylko Windows i nie mogę zainstalować nowego oprogramowania.

type file1.txt file2.txt > out.txt

pozwala mi prawie uzyskać to, czego chcę, ale nie chcę, aby pierwsza linia pliku2.txt była zawarta w out.txt.

Zauważyłem, że morema +nopcję określenia linii startu, ale nie udało mi się ich połączyć, aby uzyskać pożądany wynik. Zdaję sobie sprawę, że może to nie być możliwe w systemie Windows i zawsze mogę ręcznie edytować plik out.txt, aby pozbyć się tego wiersza, ale czy istnieje prosty sposób na zrobienie tego z wiersza poleceń?

James
źródło

Odpowiedzi:

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

lub możesz użyć copy. Zobacz copy /?więcej.

copy /b temp+file1.txt  out.txt
ghostdog74
źródło
4
Oczywiście! Wolałbym jednak uniknąć używania plików tymczasowych. Próbowałem użyć nawiasów, potoków i <, aby umieścić to w jednym poleceniu, ale nie mogłem nigdzie dotrzeć. copyKomenda jest znacznie szybsze, ale stawia znak SUB na końcu. Czy jest sposób, aby tego uniknąć?
James
18
Dodam, że jeśli chcesz połączyć WSZYSTKIE pliki, możesz to zrobić copy /b *.txt combined.txtbez konieczności wyszczególniania plików indywidualnie.
Phlucious
1
bardziej pozornie zamień tabulator na spacje, szkoda!
Antonio,
czy jest jakieś polecenie odzyskania oryginalnych plików ze scalonych plików?
swapnil gandhi
3
@ ghostdog74: Myślę, że trzeba type file1.txt temp > out.txtfaktycznie dołączyć drugi plik, bez nagłówka do pierwszego
Marius
61

Używam tego i działa dobrze dla mnie:

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

Oczywiście przed każdym biegiem musisz DELETE C:\Folder\ConcatenatedFile.csv

Jedynym problemem jest to, że jeśli wszystkie pliki mają nagłówki, zostanie to powtórzone we wszystkich plikach.

Raj Więcej
źródło
2
Kiedy wprowadzam nazwę pliku dla połączonego pliku, co oznacza, że ​​znajduje się na końcu plików w loaction (kolejność alfabetyczna), wtedy okna wydają się łączyć dwa razy! Skończyło się na tym, że użyłem nazwy pliku 1filename.csv, aby nie mieć problemu. Myślę, że łączenie w innym folderze powinno również działać ...
SebK
1
Jeśli użyjesz> zamiast >>, nie musisz wcześniej usuwać pliku. > przekierowuje wyjście i za każdym razem tworzy nowy plik. >> przekierowuje dane wyjściowe i dołącza.
Eddie Deyo,
1
Jak to powoduje pominięcie pierwszej linii w pliku2, o którą pytał OP?
Dan Dascalescu
1
Nie pomija pierwszej linii w pliku2. Brakowało mi tej części pytania.
Raj More
1
czy jest jakieś polecenie odzyskania oryginalnych plików ze scalonych plików?
swapnil gandhi
21

Nie mam wystarczającej liczby punktów reputacji, aby skomentować zalecenie *.csv >> ConcatenatedFile.csv, ale mogę dodać ostrzeżenie:

Jeśli utworzysz ConcatenatedFile.csvplik w tym samym katalogu, którego używasz do konkatenacji, zostanie on dodany do siebie.

John Faughnan
źródło
2
Jak to powoduje pominięcie pierwszej linii w pliku2, o którą pytał OP?
Dan Dascalescu
6

Użyj polecenia FOR, aby wywołać echo pliku wiersz po wierszu, a z opcją `` pomiń '', aby pominąć kilka linii początkowych ...

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

Możesz przekierować dane wyjściowe pliku wsadowego, zawierającego coś takiego jak ...

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

Zwróć uwagę na podwójny%, gdy zmienna FOR jest używana w pliku wsadowym.

Alberto Rossini
źródło
4

Oto jak to zrobić:

(type file1.txt && more +1 file2.txt) > out.txt
Waldo
źródło
3

Umieściłbym to w komentarzu do ghostdog74, z wyjątkiem tego, że moja rep jest zbyt niska, więc proszę.

more +2 file2.txt > temp
Ten kod faktycznie zignoruje wiersze 1 i 2 pliku. OP chce zachować wszystkie wiersze z pierwszego pliku (aby zachować wiersz nagłówka), a następnie wykluczyć pierwszy wiersz (prawdopodobnie ten sam wiersz nagłówka) z drugiego pliku, aby wykluczyć tylko wiersz nagłówka, którego OP powinien używać more +1.

type temp file1.txt > out.txt

Nie jest jasne, jaka kolejność wynika z tego kodu. Jest tempdołączany do file1.txt(zgodnie z potrzebą) lub jest file1.txtdołączany do temp(niepożądane, ponieważ wiersz nagłówka zostałby umieszczony w środku pliku wynikowego).

Ponadto operacje te zajmują NAPRAWDĘ DŁUGO w przypadku dużych plików (np. 300 MB)

Brian D.
źródło
2

Wiem, że powiedziałeś, że nie możesz zainstalować żadnego oprogramowania, ale nie jestem pewien, jak rygorystyczne jest to ograniczenie. W każdym razie miałem ten sam problem (próbowałem połączyć dwa pliki z przypuszczalnie tymi samymi nagłówkami) i pomyślałem, że podam alternatywną odpowiedź dla innych, którzy pojawią się na tej stronie, ponieważ zadziałało świetnie dla mnie.

Po wypróbowaniu całej masy poleceń w oknach i silnej frustracji, a także wypróbowaniu wszelkiego rodzaju edytorów graficznych, które obiecały otworzyć duże pliki, ale nie mogłem, w końcu wróciłem do moich korzeni Linuksa i otworzyłem mojego Cygwina skłonić. Dwie komendy:

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

W przypadku file1.csv800 file2.csvMB i 400 MB te dwie komendy na moim komputerze zajęły mniej niż 5 sekund. W zachęcie Cygwin, nie mniej. Myślałem, że polecenia Linuksa powinny być powolne w Cygwin, ale takie podejście wymagało znacznie mniej wysiłku i było o wiele łatwiejsze niż jakiekolwiek podejście Windows, które mogłem znaleźć.

Andrew Mao
źródło
1

W PowerShell:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
Słoik
źródło
0

Możesz też po prostu spróbować

type file2.txt >> file1.txt

Doda zawartość plik2.txt na końcu plik1.txt

Jeśli potrzebujesz oryginalnego pliku file1.txt, wykonaj wcześniej kopię zapasową. Albo możesz to zrobić

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

Jeśli chcesz mieć podział wiersza na końcu pierwszego pliku, możesz wypróbować następujące polecenie przed dołączeniem.

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt
Hamed
źródło
0

Pomoc dla copywyjaśnia, że ​​symbole wieloznaczne mogą być używane do łączenia wielu plików w jeden.

Na przykład, aby skopiować wszystkie pliki .txt w bieżącym folderze, które rozpoczynają się od „abc”, do jednego pliku o nazwie xyz.txt:

copy abc*.txt xyz.txt
GaTechThomas
źródło
-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt
Wujin
źródło
-1

Odbywa się to Test.txtz nagłówkami oraz dołącza Test1.txti Test2.txtzapisuje wyniki do Testresult.txtpliku po usunięciu nagłówków odpowiednio z drugiego i trzeciego pliku:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
user10301222
źródło