我从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
答案 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
>
检查一下