1

我有一个 SQL 转储。我已经处理了它的内容sed以产生当前的形式。

7022,4749463839619600C700F700000000000101010....
9254,47494638396196008300F700000000003737373....
2613,FFD8FFE000104A4649460001020100C800C8000....
......

我想生成多个文件,文件名是冒号(7022, 9254, 2613)之前的字段,扩展名依赖于第二个字段。如果它以开头,4749则扩展名将是.gifelse .jpeg。该文件的内容是反向十六进制转储的第二个字段。

4

3 回答 3

2

您可以使用以下方法轻松创建文件awk

$ ls
file.sql 

$ cat file.sql
7022,4749463839619600C700F700000000000101010
9254,47494638396196008300F700000000003737373
2613,FFD8FFE000104A4649460001020100C800C8000

$ awk -F, '{$2~/^4749/?f=$1".gif":f=$1".jpeg";system("xxd -r -p - "f"<<<"$2)}' file.sql

$ ls
2613.jpeg  7022.gif  9254.gif  file.sql

$ file 7022.gif 
7022.gif: GIF image data, version 89a, 150 x 199

$ xxd 7022.gif 
0000000: 4749 4638 3961 9600 c700 f700 0000 0000  GIF89a..........
0000010: 0101 01                                  ...
于 2013-03-10T14:12:02.953 回答
0

如果 perl 没问题,您可以使用以下脚本:

#!/usr/bin/perl

use warnings;
use strict;

my $debug = 1;

while (<>) {
  chomp;

  my ($basename, $data) = split ',';

  my $ext = ($data =~ /^4749/) ? 'gif' : 'jpeg';

  my $filename = "$basename.$ext";

  print "writing data for $filename: $data\n" if $debug;

  my $bytes = pack "H*", $data;

  open (my $file, ">$filename");
  print $file $bytes;
  close $file;
}
于 2013-03-10T13:45:25.890 回答
0

这可能有效...

#!/bin/bash
IFS=','
while read name data dummy; do
  m=${data:0:4}
  case $m in
    4749)
      ext=gif ;;
    *)
      ext=jpeg ;;
  esac
  xxd -r -p - $name.$ext <<<$data
done
于 2013-03-10T14:51:43.573 回答