2013-03-10 80 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