#bash #file-io #gzip
#bash #file-io #gzip
Вопрос:
У меня 305 файлов. Каждая строка составляет ~ 10 миллионов строк. Мне нужно изменить только первые 20 строк каждого файла.
В частности, мне нужно добавить # в качестве первого символа первых 18 строк, удалить 19-ю строку (но безопаснее сказать, удалить все полностью пустые строки и заменить> на # в 20-й строке.
Оставшиеся 9,9999999 млн строк вообще не нужно изменять.
Если файлы не были архивированы, я мог бы сделать что-то вроде:
while read F; do
for i in $(seq 1 100); do
awk '{gsub(/#/,"##"); print $0}' $F
awk more commands
awk more commnds
done
done < "$FNAMES"
но что действительно бросает вызов, так это тот факт, что все файлы архивированы. Есть ли какой-либо способ эффективно изменить эти 20 строк без распаковки и / или перезаписи всего файла?
Комментарии:
1. zcat их, затем gzip обратно.
2. Извините, я не понимаю. В последнем предложении моего сообщения говорится: «Есть ли какой-либо способ эффективно изменить эти 20 строк без распаковки и / или перезаписи всего файла?» … Я спрашиваю, является ли это единственным способом сделать это, а не то, что это можно сделать. Я знаю, что это можно сделать. Большое спасибо.
3. и распаковка / повторная загрузка не так уж и плоха, если вы делаете это во время обработки, а не заранее.
4. И нет, я не думаю, что вы можете изменить архивированный файл каким-либо значимым и эффективным способом.
5. Мне также интересно узнать, что, по вашему мнению, вы получите, просто изменив начало файла. потому что это, скорее всего, приведет к перезаписи больших частей файла на диск, поскольку вы добавляете символы. (в зависимости от файловой системы). Я бы понял, если бы вы просто изменяли некоторые символы, тогда было бы намного эффективнее редактировать на месте.
Ответ №1:
Нет, это невозможно. С помощью адаптивных схем сжатия (таких, как система Lempel-Ziv, которую использует gzip), он корректирует кодировку на основе того, что он видит при просмотре файла. Это означает, что способ сжатия (и, следовательно, распаковки) конца файла зависит от начала файла. Если вы измените только начало (сжатого) файла, вы измените способ распаковки конца, что существенно повредит файл.
Таким образом, распаковка, изменение и повторное сжатие — единственный способ сделать это.