2010-01-27 11 views
193

Jaki jest najszybszy i najbardziej pragmatyczny sposób na połączenie całego pliku * .txt w katalogu do jednego dużego pliku tekstowego?Łączenie wielu plików tekstowych w pojedynczy plik w Bash

Obecnie używam systemu Windows z cygwin, więc mam dostęp do BASH.

Polecenie powłoki systemu Windows też byłoby miłe, ale wątpię, czy istnieje.

Odpowiedz

355

ten dołącza wyjście do all.txt

cat *.txt >> all.txt 

ta nadpisuje all.txt

cat *.txt > all.txt 
+18

możesz napotkać problem, w którym koty all.txt do all.txt ... Mam problem z grep czasami, nie jestem pewien, czy kot ma takie samo zachowanie. – rmeador

+5

@rmeador tak, to prawda, jeśli plik all.txt już istnieje, będziesz miał ten problem. Ten problem został rozwiązany przez podanie pliku wyjściowego z innym rozszerzeniem lub przeniesienie pliku all.txt do innego folderu. –

+2

cat * .txt >> tmp; mv tmp all.txt (i upewnij się, że all.txt wcześniej nie istnieje) – Renaud

18

Można użyć Windows shell copy do łączenia plików.

C:\> copy *.txt outputfile 

Z pomocą:

Aby dołączyć pliki, określ jeden plik docelowy, ale wiele plików źródłowych (używając symboli wieloznacznych lub + plik2 + formatu plik1 plik3).

+0

To jako najczystsze rozwiązanie IMHO z praktycznie żadnymi efektami ubocznymi, na które początkujący mogą się potknąć, niestety nie jest wystarczająco doceniane :-( – Grmpfhmbl

27

Windows polecenie powłoki type można to zrobić:

type *.txt >outputfile 

Rodzaj komenda type pisze także nazwy plików do standardowego wyjścia błędów, które nie zostały przechwycone przez operatora przekierowania > (ale pojawi się na konsoli) .

+6

+1 dla natywnego rozwiązania – Cheezmeister

+2

Należy pamiętać, że jeśli umieścisz plik wyjściowy w tym samym katalogu co oryginalny plik spowoduje duplikację, ponieważ spowoduje to również dwukrotne połączenie nowego pliku wyjściowego: – CathalMF

91

Pamiętaj tylko, że w przypadku wszystkich rozwiązań podanych do tej pory powłoka decyduje o kolejności, w jakiej pliki są łączone. Dla Basha, IIRC, to kolejność alfabetyczna. Jeśli zamówienie jest ważne, należy odpowiednio nazwać pliki (01file.txt, 02file.txt, etc ...) lub określić każdy plik w kolejności, w jakiej ma być łączony.

$ cat file1 file2 file3 file4 file5 file6 > out.txt 
4

Najbardziej pragmatycznym sposobem na pocisk jest polecenie kota. inne sposoby obejmują,

awk '1' *.txt > all.txt 
perl -ne 'print;' *.txt > all.txt 
+1

'perl -pe 1 * .txt> all.txt' –

+0

To powinno być poprawną odpowiedzią dla większości przypadków Jeśli dowolny plik tekstowy bez pusta nowa linia, przy użyciu całej powyższej metody "cat" połącz konkatenację ostatniej linii i pierwszej linii z sąsiednimi plikami – mootmoot

-3

wszystko jest paskudny ....

ls | grep *.txt | while read file; do cat $file >> ./output.txt; done; 

łatwy rzeczy.

+6

Eeek! Nie rób tego, rób 'find. -iname" * .txt "-maxdepth 1 -exec cat { } >> out.txt \; ' –

+6

Dla każdego, kto zastanawia się, dlaczego tego nie robić: http://mywiki.wooledge.org/ParsingLs – Momer

3
type [source folder]\*.[File extension] > [destination folder]\[file name].[File extension] 

na przykład:

type C:\*.txt > C:\1\all.txt 

który zabierze wszystkie pliki txt w folderze C: \ i zapisać go w katalogu C: \ 1 Folder o nazwie all.txt

lub

type [source folder]\* > [destination folder]\[file name].[File extension] 

na przykład:

type C:\* > C:\1\all.txt 

Spowoduje to pobranie wszystkich plików znajdujących się w folderze i umieszczenie w nim treści w C: \ 1 \ all.txt

2

Co powiesz na to podejście?

find . -type f -name '*.txt' -exec cat {} + >> output.txt 
+0

od OP mówi, że pliki znajdują się w tym samym katalogu, może być konieczne dodanie '-maxdepth 1' do polecenia' find'. – codeforester

+0

Działa wspaniale z dużą liczbą plików, w których nie można zaakceptować przyjętej odpowiedzi – amine

Powiązane problemy