Об'єднайте декілька txts в одну

Я намагаюся об'єднати декілька txts у великий файл. Я хочу, щоб вони були поставлені в послідовність, але це, здається, не працює належним чином.

At this time I tried from the terminal:cat *.txt >merged.txt but this seems to concatenate the files randomly.

У моїй папці є всі файли, названі послідовними номерами (від 1.txt до 10000.txt). Я щось пропускаю?

5

6 Відповіді

Globbing не є випадковим, він гарантовано має бути алфавітним (так званий лексикографічний порядок за вашою мовою) "https://superuser.com/a/192355/156757"> відрізняється від цифрового порядку сортування .

Для цього можна використовувати розширення фігурної дужки. Замініть "10" на номер останнього файлу.

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

Це використовує розширення баш-дужок, про яке ви можете прочитати на LESS = '+/Brace Expansion' man bash .

Зауважимо, що на відміну від файлових глоб, розширення фігурної дужки буде генерувати довільні рядки, які не повинні бути існуючими файлами; у цьому випадку це означає, що ви отримаєте помилки, якщо файли відсутні в послідовності (наприклад, якщо 7.txt не існує). Однак це не вплине на вміст merged.txt , який буде створено, як очікувалося.

10
додано
Це невиправдано квадратичне; cat $ (для i в {1..10}; echo "$ {i} .txt"; done) >> merged.txt цілком достатньо.
додано Автор zombat, джерело
@Wildcard Ви, звичайно, правильно, що краще глобування перевершує за петлю; Я просто ніколи не думав використовувати розширення дужки як компонент для більшого слова. Дякуємо за покращення.
додано Автор zombat, джерело
@wchargin Дякуємо, це акуратніше, я думав, що {1..10} - це zsh річ, але я повинен був подумати про те, як багато котів аргументи, як він призначений для використання.
додано Автор Pacerier, джерело
@Wildcard Ви маєте рацію, тільки що помітили, що ви також дали відповідь, проголошене
додано Автор Pacerier, джерело
Вам не потрібний цикл для ; потрібно краще глобалізацію файлів (наприклад, zsh ).
додано Автор Wildcard, джерело
Дякую; У цій відповіді я спростив команду, щоб бути більш ідіоматичною - сподіваюся, ви не проти. :) Так я б зробив це з bash; вгору.
додано Автор Wildcard, джерело

In command promt:
cd "path to directory" (Enter)
copy *.txt result.txt (Enter)

4
додано
Що сказав @ Kevin ... Я не пам'ятаю, що використовував цей метод, щоб об'єднати файли в Windows, тому я не знаю, як ви отримали відповідь.
додано Автор Douglas, джерело
Не впевнений, що це вікно, але copy навіть не команда на macOS, і cp не працює так. Дивіться інші відповіді.
додано Автор Telmo Marques, джерело

Використовуйте zsh з розширеними глобусами і увімкніть чисельне сортування розширень glob за допомогою класифікатора (n) glob:

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

Ви можете отримати більш точну інформацію про глобуси, а також:

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

Докладнішу інформацію див. У розділі man zshexpn .

3
додано
Якщо у вас є набір параметрів multios , ви можете пропустити cat і просто використати <*. Txt (n)> merged.txt (або < код> <*. txt ~ merged.txt (n)> merged.txt у випадку, якщо він уже існує)
додано Автор Telmo Marques, джерело
@JAB не збігатиметься. Спробуй це.
додано Автор Wildcard, джерело
Це малоймовірно, але що станеться, якщо розширення є літеральним .txt (n) ?
додано Автор Kelvin, джерело

Як правило, ви не розбирайте вихідний код ls , а як ваш назви файлів не містять пробілів або "незвичайних" символів, ми можемо зробити це:

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

+ ([0-9]) - це bash розширена шаблона glob для відповідності лише одному чи більше числам.

З GNU ls (доступний через домашній бренд у пакеті coreutils)

ls -v +([0-9]).txt | xargs cat > merged.txt
1
додано

Голівки вгору. Якщо файли дійсно пронумеровані 1 - 10000, то операційна система сортує ваші файли в порядку першого числа: 1.txt 11.txt 12.txt ... 19.txt 100.txt ... 2.txt 20.txt 21.txt

і т.д.

Необхідно перейменувати файли як 00001, 00002 і так далі.

1
додано
@Brandito - немає такої команди, як rename у встановленні за замовчуванням Mac. І навіть на Linux команда, яку ви написали, не працюватиме; є різні несумісні синтаксиси для rename на різних дистрибутивах Linux .
додано Автор Wildcard, джерело
Сторона питання: швидкий спосіб зробити це? Автоматизатор? термінал?
додано Автор Jeremy K, джерело
перейменувати .txt 0000 .txt?
додано Автор hanzo2001, джерело

Іншою можливою відповіддю може бути:

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


On a GNU/Linux system you can do ls -v | xargs cat > merged.txt, but this is specific to the GNU version of ls and does not work for BSD ls.

1
додано
-1, ls -v на Mac робить щось зовсім інше, ніж ls -v у Linux. Mac використовує інструменти BSD, а -v для чисельного сортування файлів є лише функцією GNU ls . Для BSD ls , -v означає Примусове недрукове друкування неграфічних символів; це значення за замовчуванням, коли вихід не до терміналу.
додано Автор Wildcard, джерело
Мій поганий, я буду оновлювати свою відповідь, щоб відобразити це.
додано Автор Prabash, джерело