У меня есть несколько отсортированных, сжатых файлов в каталоге. Как мне объединить некоторые из них в другой отсортированный файл gzip? Прямо сейчас я использую явные фифы. Есть ли способ сделать это в Bash без? Я немного заурядный, так что прошу прощения за отсутствие стиля.
#!/bin/bash
# Invocation ./merge [files ... ]
# Turns an arbitrary set of sorted, gzipped files into a single sorted, gzipped file,
# printed to stdout. Redirect this script's output!
for f in $@
do
mkfifo $f.raw
gzcat $f > $f.raw &
# sort -C $f.raw
done
sort -mu *.raw | gzip -c # prints to stdout.
rm -f *.raw
Я хочу преобразовать это во что-то вроде ...
sort -mu <(gzcat $1) <(gzcat $2) <(gzcat $3) ... | gzip -9c # prints to stdout.
... но не знаю как. Нужен ли цикл, строящий параметры для строки? Есть ли какая-то волшебная комбинация для этого? Может быть map gzcat $@
?
ПРИМЕЧАНИЕ. Размер каждого из файлов превышает 10 ГБ (и 100 ГБ разархивировано). У меня есть диск 2TB, так что это не проблема. Кроме того, эта программа ДОЛЖНА работать в режиме O (n), иначе она станет невозможной.