Unix从文件中提取数据

时间:2018-09-27 06:09:28

标签: unix awk sed

我从notifyix数据库导出中得到一个file.sql文件。 以下是文件的一小部分(我对数据进行了一些更改以使其匿名):

grant dba to "xxx";
grant dba to "yyy";
grant dba to "zzz";

{ TABLE "xxx".table1 row size = 66 number of columns = 5 index size = 54 }
{ unload file name = table00100.unl number of rows = 307 }

create table "xxx".table1 
  (
    field1 char(2) not null ,
    field2 char(10) not null ,
    field3 char(30),
    field4 char(20) not null ,
    field5 date not null 
  );
revoke all on "xxx".table1 from "yyy";

我需要从该文件中将table00100.unl文件重新命名为原始表名。所以我需要这样的输出:

  

mv table00100.unl table1

我已经设法在两个文件之间添加了一些awk和sed来做到这一点,但是如果没有这两个文件之间的临时文件,这是否可能以更简单的方式实现呢?我的代码示例:

awk '{for(i=1;i<=NF;i++) {if ($i=="unload") {print $(i+4)} else {if ($i=="TABLE") print $(i+1)}}}' file.sql | sed 's/".*".//' > temp.out
awk 'NR%2{printf "%s ",$0;next;}1' temp.out | awk '{for (i=NF;i>0;i--) if (i > 1) printf("mv %s ",$i); else printf("%s\n",$i)}' > temp.shl

4 个答案:

答案 0 :(得分:4)

如果您只想使用awk:

/TABLE/ {
    sub("\".+\"\\.", "", $3);
    table = $3;
}
/unload/ {
    print "mv", $6, table;
};

答案 1 :(得分:1)

类似于georgexsh的解决方案,但使用gensub

awk '/TABLE/{table=gensub(/.*\./, "", "", $3)}/unload/{print "mv", $6, table }'

答案 2 :(得分:0)

awk '($0 ~ /{ *TABLE/)  { match($0,/TABLE */); to=substr($0,RSTART+RLENGTH);
                          match(to," ");       to=substr(to,1,RSTART-1);
                          match(to,"[.]");     to=substr(to,RSTART+1);
                        }
     ($0 ~ /{ *unload/) { match($0,"name *= *"); from=substr($0,RSTART+RLENGTH); 
                          match(from," ");       from=substr(from,1,RSTART-1)
                        }
     (from!="") && (to!="") { exit }
     END {print "mv "from" "to}' file

之所以使它如此“复杂”,是因为我不确定您输入中的所有间距是否一致,以及括号中的顺序是否始终相同。

答案 3 :(得分:0)

使用perl一行(当然很长:-))

> cat informix_unload.txt
grant dba to "xxx";
grant dba to "yyy";
grant dba to "zzz";

{ TABLE "xxx".table1 row size = 66 number of columns = 5 index size = 54 }
{ unload file name = table00100.unl number of rows = 307 }

create table "xxx".table1
  (
    field1 char(2) not null ,
    field2 char(10) not null ,
    field3 char(30),
    field4 char(20) not null ,
    field5 date not null
  );
revoke all on "xxx".table1 from "yyy";

grant dba to "xxx";
grant dba to "yyy";
grant dba to "zzz";

{ TABLE "xxx".table2 row size = 66 number of columns = 5 index size = 54 }
{ unload file name = table00200.unl number of rows = 307 }

create table "xxx".table2
  (
    field1 char(2) not null ,
    field2 char(10) not null ,
    field3 char(30),
    field4 char(20) not null ,
    field5 date not null
  );
revoke all on "xxx".table1 from "yyy";
-- other data

> perl -ne 'BEGIN{$x=qx(cat informix_unload.txt);while($x=~m/(.+?)unload file name = (\S+)(.+?)create table (\S+)(.+)/osm){$x=$5;print "$2 $4\n";}exit}'
table00100.unl "xxx".table1
table00200.unl "xxx".table2
>

检查一下