У меня есть входной файл, который всегда кратен 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 ответ
Правильный инструмент
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 часов назад