Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建文件名依赖于内容_Sql_Bash_Awk - Fatal编程技术网

Sql 创建文件名依赖于内容

Sql 创建文件名依赖于内容,sql,bash,awk,Sql,Bash,Awk,我有一个SQL转储。我已使用sed处理其内容,以生成当前表单 7022,4749463839619600C700F700000000000101010.... 9254,47494638396196008300F700000000003737373.... 2613,FFD8FFE000104A4649460001020100C800C8000.... ...... 我想生成多个文件,文件名为冒号前面的字段(7022,9254,2613),扩展名依赖于第二个字段。如果以4749开头,则扩展名为

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

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

我想生成多个文件,文件名为冒号前面的字段(
7022
9254
2613
),扩展名依赖于第二个字段。如果以
4749
开头,则扩展名为
.gif
else
.jpeg
。文件内容是第二个字段。

如果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;
}
#/usr/bin/perl
使用警告;
严格使用;
我的$debug=1;
而(){
咀嚼;
我的($basename,$data)=拆分',';
我的$ext=($data=~/^4749/)?“gif”:“jpeg”;
我的$filename=“$basename.$ext”;
如果$debug,则打印“为$filename写入数据:$data\n”;
my$bytes=pack“H*”,$data;
打开(我的$file,“>$filename”);
打印$file$字节;
关闭$file;
}

您可以使用
awk
轻松创建文件:

$ls
file.sql
$cat file.sql
70224749463839619600C7000000000000101010
925447494638396196008300f700000000373
2613,FFD8FFE0000104A4649460001020100C800C8000
$awk-F,“{$2~/^4749/?F=$1.gif”:F=$1.jpeg”系统(“xxd-r-p-”F“这可能会起作用

#!/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
!/bin/bash
如果s=','
读取名称数据时,请执行以下操作:
m=${data:0:4}
案件价值百万元
4749)
ext=gif;;
*)
ext=jpeg;;
以撒

xxd-r-p-$name.$ext“反向hextump”是什么意思?向我们展示您的代码,甚至是您所做的努力。我的意思是从hex dump创建二进制文件。例如
xxd-r
我想他希望您使用命令“xxd-r”过滤生成的文件“我认为这是错误的,因为你
打印$2>f
时,你最有可能应该将十六进制表示转换为字节。@MichaWiedenmann manu fatto感谢各位的澄清。我只想将十六进制数据转换回二进制。:)为了找回原始文件…对不起,我的英语不好。。)