У меня большой текстовый файл gzip. Я хотел бы что-то вроде:
zcat BIGFILE.GZ | \
awk (snag 10,000 lines and redirect to...) | \
gzip -9 smallerPartFile.gz
часть awk, я хочу, чтобы она взяла 10000 строк и отправила их в gzip, а затем повторяла до тех пор, пока все строки в исходном входном файле не будут использованы. Я нашел скрипт, который утверждает, что делает это, но когда я запускаю его на своих файлах, а затем сравниваю оригинал с теми, которые были разделены, а затем объединены, строки отсутствуют. Итак, что-то не так с частью awk, и я не уверен, какая часть сломана.
Цель:
- Прочитайте исходный файл один раз за всю операцию
- Разделите источник на более мелкие части, разделенные символом новой строки. Скажем, 10000 строк на файл
- Сожмите целевые файлы, созданные в результате действия разделения, и сделайте это без дополнительного шага после обработки этого сценария.
Вот код Может кто-нибудь сказать мне, почему это не приводит к файлу, который может быть разделен и объединен и затем успешно преобразован в оригинал?
# Generate files part0.dat.gz, part1.dat.gz, etc.
# restore with: zcat foo* | gzip -9 > restoredFoo.sql.gz (or something like that)
prefix="foo"
count=0
suffix=".sql"
lines=10000 # Split every 10000 line.
zcat /home/foo/foo.sql.gz |
while true; do
partname=${prefix}${count}${suffix}
# Use awk to read the required number of lines from the input stream.
awk -v lines=${lines} 'NR <= lines {print} NR == lines {exit}' >${partname}
if [[ -s ${partname} ]]; then
# Compress this part file.
gzip -9 ${partname}
(( ++count ))
else
# Last file generated is empty, delete it.
rm -f ${partname}
break
fi
done