2013-03-10 66 views
1

我有一个SQL转储。我已使用sed处理其内容以生成当前表单。创建文件名依赖内容

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

我想生产与文件名的多个文件是冒号(702292542613)前场,并且该扩展是依靠第二场。如果它以4749开头,那么扩展将是.gif否则.jpeg。该文件的内容是反向hexdumped第二个字段。

+1

“reverse hexdumped”是什么意思? – chepner 2013-03-10 13:51:17

+0

向我们展示您的代码,甚至是您努力做到您想要的。 – troyane 2013-03-10 13:53:30

+0

我的意思是从十六进制转储创建二进制文件。例如'xxd -r' – gazsiazasz 2013-03-10 14:00:34

回答

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         ... 
+0

我认为他希望你用命令“xxd -r”过滤结果文件 – 2013-03-10 14:19:51

+0

我认为这是错误的,因为当你最有可能应该转换十六进制表示时,你打印$ 2> f'到字节。 – 2013-03-10 14:24:14

+0

@MichaWiedenmann manu-fatto谢谢澄清家伙。 – 2013-03-10 15:06:39

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; 
} 
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