固定サイズのチャンクで2つのバイナリファイルをインターリーブします。

固定サイズのチャンクで2つのバイナリファイルをインターリーブします。

paste(1)ファイルを行ごとにインターリーブする機能があります。好奇心のためにそれに対応する2進数があるかどうか知りたいです。ファイルAの最初のNバイトをstdoutにコピーし、ファイルBの最初のNバイトをファイルAの最後のNバイトにコピーする必要があります。

私が思いついた解決策は次のとおりです。

$/ = \512;
my @files = map { open( my $fh, "<", $_ ); $fh } @ARGV;
while (@files) {
    @files = grep { my $c = <$_>; defined $c and print $c } @files;
}

答え1

いつでも次のことができます。

paste -d '\0' <(xxd -p -c512 file1) <(xxd -p -c512 file2) | xxd -p -r > merged

そしてzsh

#! /bin/zsh -
zmodload zsh/system

size=${1?}; shift

fds=()
for file do
  sysopen -u fd -- "$file" || exit
  fds+=$fd
done

until
  eof=true
  for fd in $fds; do
    sysread -s "$size" -i$fd -o1 && eof=false
  done
  $eof
do
  continue
done

関連情報