我有一个SQL转储。我已使用sed
处理其内容以生成当前表单。
7022,4749463839619600C700F700000000000101010....
9254,47494638396196008300F700000000003737373....
2613,FFD8FFE000104A4649460001020100C800C8000....
......
我想生成多个文件,文件名是冒号前的字段(7022
,9254
,2613
),扩展名依赖于第二个字段。如果它以4749
开头,则扩展名为.gif
其他.jpeg
。该文件的内容是反向十六进制的第二个字段。
答案 0 :(得分: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 ...
答案 1 :(得分: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;
}
答案 2 :(得分: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