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ń?

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

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.


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.


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.


4

Oto jak to zrobić:

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

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)


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źć.


1

W PowerShell:

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

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

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

-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt

-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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.