2012-03-13 30 views
2

在linux bash中,我們如何在4字節的邊界上使用填充連接文件。我有3個文件a.txt,b.txt,c.txt,並且想要連接它們以創建d.txt,每個元素文件都以4字節的邊界開始。填充文件到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 

任何建議表示讚賞。 感謝和問候, 奠

+0

不要這些文件只具有每一行或者是'a.txt'(例如)100線每一個字符的? – paxdiablo 2012-03-13 04:29:41

+0

Hi Paxdiablo,每個成員文件也是二進制文件 – 2012-03-13 07:04:00

+0

感謝大家花時間回答! – 2012-03-13 13:43:24

回答

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:for ... done> d.txt後執行重定向。 – jfg956 2012-03-13 07:28:10

+0

@jfgagne這是個好主意。 – kev 2012-03-13 07:29:13

+0

爲什麼要投票?任何想法? – kev 2012-03-13 12:21:09

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