Combina più tx in uno solo

5

Sto cercando di combinare più tx in un grande file. Voglio che vengano messi in sequenza ma questo sembra non funzionare correttamente.

In questo momento ho provato dal terminale: cat *.txt >merged.txt ma questo sembra concatenare i file in modo casuale.

Nella mia cartella ho tutti i file chiamati con numeri sequenziali (da 1.txt a 10000.txt). Mi sto perdendo qualcosa?

    
posta KingBOB 11.10.2017 - 00:09
fonte

6 risposte

10

Il Globbing non è casuale, è garantito come alfabetico (ovvero l'ordine lessicografico in base alla tua lingua), che < a href="https://superuser.com/a/192355/156757"> è diverso dall'ordinamento numerico .

Puoi usare l'espansione delle controventi per questo. Sostituisci "10" con il numero dell'ultimo file.

cat {1..10}.txt > merged.txt

Questo usa l'espansione della parentesi graffa, che puoi leggere a LESS='+/Brace Expansion' man bash .

Si noti che, diversamente dai file glob, l'espansione delle parentesi graffe genererà stringhe arbitrarie che non devono necessariamente essere file esistenti; in questo caso significa che otterrai errori se nella sequenza mancano dei file (ad esempio se 7.txt non esiste). Tuttavia, ciò non influirà sul contenuto di merged.txt che verrà prodotto come previsto.

    
risposta data 11.10.2017 - 00:24
fonte
3

Utilizza zsh con globi estesi e attiva l'ordinamento numerico delle espansioni glob con il qualificatore glob (n) :

zsh -c 'cat *.txt(n) > merged.txt'

Puoi ottenere informazioni più specifiche con i glob:

zsh -c 'cat <1-10000>.txt(n) > merged.txt'

Visualizza man zshexpn per i dettagli completi.

    
risposta data 11.10.2017 - 02:09
fonte
1

Normalmente, non analizza l'output di ls , ma poiché i nomi dei file non contengono spazi bianchi o "insoliti" caratteri, possiamo fare questo:

shopt -s extglob
ls +([0-9]).txt | sort -n | xargs cat > merged.txt

Il +([0-9]) è un bash pattern glob esteso da abbinare solo uno o più numeri.

Con GNU ls (disponibile tramite homebrew nel pacchetto coreutils)

ls -v +([0-9]).txt | xargs cat > merged.txt
    
risposta data 11.10.2017 - 02:36
fonte
1

Un'altra possibile risposta potrebbe essere:

ls | sort -n | xargs cat > merged.txt


Su un sistema GNU / Linux puoi fare ls -v | xargs cat > merged.txt , ma questo è specifico per la versione GNU di ls e non funziona per BSD ls .

    
risposta data 11.10.2017 - 07:56
fonte
1

Avviso. Se i file sono effettivamente numerati 1 - 10000, il sistema operativo ordina i file nell'ordine del primo numero: 1.txt 11.txt 12.txt ... 19.txt 100.txt ... 2.txt 20.txt 21.txt

ecc.

Dovresti rinominare i file come 00001, 00002 e così via.

    
risposta data 11.10.2017 - 00:17
fonte
-4

Nel comando promt:
cd "percorso nella directory" (Invio)
copia * .txt result.txt (Invio)

    
risposta data 11.10.2017 - 04:39
fonte

Leggi altre domande sui tag