Объединить определенное количество файлов - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть набор файлов с именем uv_set_XXXXXXXX, где 6 X обозначают обычный формат года, месяца и дня.Представьте, что у меня есть 325 файлов этого типа.Я хотел бы объединить группы из 50 файлов, поэтому в итоге у меня есть 7 файлов (6 файлов по 50 и 1 из 25).

Я думал об использовании cat, но не могуувидеть опцию, чтобы выбрать количество файлов из списка.Я мог бы сделать это с Python, но мне просто интересно, если какая-нибудь утилита командной строки Unix сделает это более напрямую.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я бы просто сломался и сделал бы это в Awk.

awk 'FNR==1 && (++i%50 == 0) {
    if(NR>1) close p;
    p = "dest_" ++j }
    { print >p }' uv_set_????????

Это создает файлы с dest_1 по dest_7, первые 6 с 50 файлами в каждом и последний с остатком.

Закрытие предыдущего файла необходимо, потому что система позволяет Awk иметь ограниченное количество дескрипторов открытых файлов (хотя ограничение, как правило, выше 7, так что это, вероятно, не важно в вашем примере).


Размышляя вслух, просто чтобы никто не потратил время на повторение этого тупика.

Вы можете использовать xargs -L 50 cat для объединения 50 файлов за один раз, но не существует простого способа передать новое перенаправление для стандартного вывода для каждого вызова. Вы можете попытаться обойти это с помощью чего-то вроде

# XXX Do not use: incomplete
printf '%s\n' uv_set_???????? |
xargs -L 50 sh -c 'cat "$@" > ... something' _

но я не могу придумать изящный способ каждый раз отличаться something.

0 голосов
/ 19 ноября 2018

Параллельно с GNU вы можете использовать следующую команду

parallel -n50 "cat {} > out{#}" ::: uv_set_*

Это объединит первые 50 файлов в out1, следующие 50 файлов в out2 и т. Д.

...