дополняющий файл до 4-байтовой границы - PullRequest
2 голосов
/ 13 марта 2012

В linux bash, как мы можем объединить файлы с заполнением на 4-байтовой границе? У меня есть 3 файла a.txt, b.txt, c.txt, и я хочу объединить их для создания d.txt, каждый файл элемента запускается на 4-байтовой границе.

a.txt: 1 byte
b.txt: 2 bytes
c.txt: 4 bytes

d.txt should be
0-3: a.txt
4-7: b.txt
8-11: c.txt

Любые предложения приветствуются. Спасибо и всего наилучшего, Дьен

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Предполагая, что вы хотите заполнить пробелами, одно относительно простое решение:

perl -wpE 'BEGIN{ $/ = \4 } print " " x ( 4 - length )
    if length != 4' a.txt b.txt c.txt > d.txt
2 голосов
/ 13 марта 2012

Если вам нужно заполнение нулевым байтом, вы можете использовать head как с фактическими файлами, так и с /dev/zero (чтобы получить заполнение). Сначала настройте несколько тестовых файлов:

pax> echo -n 1 >a.txt ; echo -n 12 >b.txt ; echo -n 1234 >c.txt

Тогда следующий код даст вам то, что вы хотите.

pax> ( head -c1 a.txt ; head -c3 /dev/zero ;
       head -c2 b.txt ; head -c2 /dev/zero ;
       head -c4 c.txt ) | od -xcb
0000000    0031    0000    3231    0000    3231    3433
          1  \0  \0  \0   1   2  \0  \0   1   2   3   4
        061 000 000 000 061 062 000 000 061 062 063 064
0000014

Вы можете видеть, что заполнение помещено в выходной поток. Таким образом, скрипт для этого так же просто, как:

( head -c1 a.txt ; head -c3 /dev/zero )  >d.txt
( head -c2 b.txt ; head -c2 /dev/zero ) >>d.txt
( head -c4 c.txt                      ) >>d.txt

Или, если вы на самом деле не заботитесь о том, что входит в область заполнения, вы можете использовать однострочную строку, например:

cat [abc].txt | sed 's/^\(.\)\(..\)/\1___\2__/' >d.txt

Будет создан файл, содержащий:

1___12__1234
1 голос
/ 13 марта 2012
for i in {a..c}.txt
do
    cat $i
    head -c $(((4-$(stat -c %s $i)%4)%4)) /dev/zero
done >d.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...