unix从文件中提取数据
我从informix数据库导出中得到了一个unix从文件中提取数据,unix,awk,sed,Unix,Awk,Sed,我从informix数据库导出中得到了一个文件.sql文件。 以下是文件的一小部分(我稍微更改了数据以使其匿名): 我需要从这个文件中将table00100.unl文件命名为原始表名。所以我需要这样的输出: 中压表00100.unl表1 我已经设法用两个文件来解决这个问题,中间有一点awk和sed,但是如果没有中间的临时文件,这不是更容易实现吗?我的代码示例: awk '{for(i=1;i<=NF;i++) {if ($i=="unload") {print $(i+4)} else {
文件.sql
文件。
以下是文件的一小部分(我稍微更改了数据以使其匿名):
我需要从这个文件中将table00100.unl文件命名为原始表名。所以我需要这样的输出:
中压表00100.unl表1
我已经设法用两个文件来解决这个问题,中间有一点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
awk'{for(i=1;i0;i--)if(i>1)printf(“mv%s”,$i);else printf(“%s\n”,$i)}>temp.shl
我之所以把它弄得如此“复杂”,是因为我不确定输入中的所有间距是否一致,大括号中的顺序是否始终相同
我之所以把它弄得如此“复杂”,是因为我不确定输入中的所有间距是否一致,大括号中的顺序是否始终相同。如果您只想使用awk:
/TABLE/ {
sub("\".+\"\\.", "", $3);
table = $3;
}
/unload/ {
print "mv", $6, table;
};
如果您想单独使用awk:
/TABLE/ {
sub("\".+\"\\.", "", $3);
table = $3;
}
/unload/ {
print "mv", $6, table;
};
与georgexsh的解决方案类似,但使用的是gensub:
awk '/TABLE/{table=gensub(/.*\./, "", "", $3)}/unload/{print "mv", $6, table }'
与georgexsh的解决方案类似,但使用的是gensub:
awk '/TABLE/{table=gensub(/.*\./, "", "", $3)}/unload/{print "mv", $6, table }'
使用一行perl(当然是长的:-)
使用perl单行代码(当然很长:-)检查一下
检查这个这只给出了第一个表格,我有300多行这样的,我如何循环这只给出了第一个表格,我有300多行这样的,我如何循环这我可以更改打印“mv”,6美元,表格;至系统(“mv”$6”表);要立即执行移动?当然可以,但是,首先,您最好将这些脚本输出到控制台或文件以检查其正确性。sub()的第一个参数是regexp而不是字符串,因此请使用regexp分隔符,以便awk不必对其进行两次解析,即
sub(/“+”\。/,“,$3)
。此外,移动还应提供引号、printf“mv\047%s\047\047%s\047\n”、$6、表
,这样当shell稍后执行时,它不会公开用于全局搜索、分词和文件名扩展。最后-您不需要在每一行后面加分号。@nightfox79您真的不应该让awk参与打印mv
或执行mv
,因为这会在awk脚本和调用shell脚本之间创建紧密耦合。只需让awk查找并打印from和to名称,然后让调用shell使用它们执行mv
或其他任何操作。我是否可以更改打印“mv”,即$6,表;至系统(“mv”$6”表);要立即执行移动?当然可以,但是,首先,您最好将这些脚本输出到控制台或文件以检查其正确性。sub()的第一个参数是regexp而不是字符串,因此请使用regexp分隔符,以便awk不必对其进行两次解析,即sub(/“+”\。/,“,$3)
。此外,移动还应提供引号、printf“mv\047%s\047\047%s\047\n”、$6、表
,这样当shell稍后执行时,它不会公开用于全局搜索、分词和文件名扩展。最后-您不需要在每一行后面加分号。@nightfox79您真的不应该让awk参与打印mv
或执行mv
,因为这会在awk脚本和调用shell脚本之间创建紧密耦合。只需让awk查找并打印from和to名称,然后让调用shell对它们执行mv
或其他任何操作。
> 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
>