Копировать каждые 512 байт и пропускать следующие 8 байтов из входного файла в выходной файл

У меня есть входной файл, который всегда кратен 520 байтам. я, е

Input file 1- 1040 bytes
Input file 2- 5200 bytes 

Мне нужно скопировать каждые 512 байтов из входного файла и пропустить следующие 8 байтов из входных файлов в выходной файл, т.е.

Output file data = Copy first 512 bytes of input file - Skip 8 bytes - Copy second 512 bytes of input file- Skip 8 bytes --..

Следовательно, мой выходной файл всегда должен быть кратным 512 байтам.

Input file 1- 1040 bytes        Output file 1 - 1024 bytes
Input file 2- 5200 bytes        Output file 2 - 5120 bytes

Мне нужно сделать это в сценарии оболочки, любая помощь здесь, пожалуйста.

1 ответ
1

Правильный инструмент

bbe это sed-подобный редактор для двоичных файлов ». В Debian он находится в пакете с именем bbe. То, что вы хотите, можно сделать так:

<"Input file 1" bbe -b :520 -e 'd 512 *' >"Output file 1"

bbe правильный инструмент. Если вы можете использовать это, используйте его. Приведенный ниже сценарий предназначен на случай, если вы не можете использовать bbe.


Портативный скрипт

Не самый быстрый код, но вот он:

#!/bin/sh

useful=512
useless=8

while :; do
   dd bs=1 count="$useful" 2>/dev/null
   [ "$(dd bs=1 count="$useless" 2>/dev/null | wc -c)" -lt "$useless" ] && exit
done

Сохраните код как my_filter, затем вызовите:

<"Input file 1" ./my_filter >"Output file 1"

Заметки:

  • Я думаю, что код переносимый.
  • bbe намного быстрее (хотя с файлом размером 5200 байт или меньше вы, вероятно, не заметите разницы).
  • Может показаться bs="$useful" count=1 должно быть лучше, но только если ваш dd поддерживает iflag=fullblock (может и нет), и вы его используете. Читать Каким способом POSIX считать точное количество байтов из файла?
  • Код выходит, когда второй dd читает меньше, чем следовало бы. Таким образом обнаруживается EOF. Для ваших файлов (“всегда кратно 520 байтам”) первый dd будет читать меньше, чем следовало бы, до того, как это сделает второй, но обнаружив эту ситуацию с первым dd переносимым способом при сохранении вывода не так просто, как использование wc -c со вторым dd вывод которого в любом случае следует отбросить.
  • Из-за того, как сценарий обнаруживает EOF, он не будет отбрасывать частичный полезный блок, если он когда-либо произойдет (то есть, если EOF произойдет в середине). Однако для ваших файлов («всегда кратно 520 байтам») этого никогда не должно происходить. С произвольными размерами такое бывает. Обратите внимание на предоставленные bbe команда генерирует тот же результат, что и сценарий, даже в этих обстоятельствах.
  • Чтобы настроить сценарий и использовать значения, отличные от 512 и 8, достаточно изменить useful=512 и useless=8 линий.
  • Из-за того, как скрипт обнаруживает EOF, он никогда не выйдет, если вы установите useless=0 (этот краевой случай тривиально решается с помощью cp "Input file 1" "Output file 1").
  • dd поддерживает skip=. Используя это, чтобы пропустить $useless bytes кажется довольно элегантным, но тогда обнаружение EOF усложняется.

  • Идеальный ответ .. Еще раз спасибо !!.

    – ivl
    16 часов назад

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *