unix从文件中提取数据

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 {

我从informix数据库导出中得到了一个
文件.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
>