2012-03-13 4 views
2

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

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 

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

+0

ли эти файлы имеют только одну строку каждый или является 'a.txt' (например) 100 строк одного символа каждого? – paxdiablo

+0

Привет, Paxdiablo, каждый файл-член также является двоичным файлом –

+0

Спасибо всем за то, что ответили на вопрос! –

ответ

1
for i in {a..c}.txt 
do 
    cat $i 
    head -c $(((4-$(stat -c %s $i)%4)%4)) /dev/zero 
done >d.txt 
+0

Вы можете выполнить перенаправление после: 'for ... done> d.txt'. – jfg956

+0

@jfgagne Это хорошая идея. – kev

+0

Зачем голосовать? Есть идеи? – kev

3

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

perl -wpE 'BEGIN{ $/ = \4 } print " " x (4 - length) 
    if length != 4' a.txt b.txt c.txt > d.txt 
2

Если вам нужен нулевой байт отступы, вы можете использовать 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