依赖内容创建文件名

时间:2013-03-10 13:32:24

标签: sql bash awk

我有一个SQL转储。我已使用sed处理其内容以生成当前表单。

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

我想生成多个文件,文件名是冒号前的字段(702292542613),扩展名依赖于第二个字段。如果它以4749开头,则扩展名为.gif其他.jpeg。该文件的内容是反向十六进制的第二个字段。

3 个答案:

答案 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