如果匹配特定模式,则获取相应的表名

如果匹配特定模式,则获取相应的表名

如果从下面的文件中找到特定模式,我需要列出表名称。

CREATE TABLE IMS.ACTIVITY (
        "ID" INTEGER NOT NULL ,
        OWNING_TYPE FOR COLUMN OWNIN00001 VARCHAR(20) CCSID 37 NOT NULL ,
        OWNING_ID INTEGER NOT NULL ,
        ACTIVITY_TYPE FOR COLUMN ACTIV00001 VARCHAR(50) CCSID 37 NOT NULL ,
        CAMPAIGN_TYPE FOR COLUMN CAMPA00001 VARCHAR(50) CCSID 37 NOT NULL ,
        AUTHOR VARCHAR(100) CCSID 37 NOT NULL ,
        COMPLETED TIMESTAMP NOT NULL ,
        "COMMENT" VARCHAR(1000) CCSID 37 DEFAULT NULL ,
        CUR_LOCN_STATUS FOR COLUMN CUR_L00001 VARCHAR(20) CCSID 37 DEFAULT NULL ,
        FOLLOWUP_DATE FOR COLUMN FOLLO00001 DATE DEFAULT NULL ,
        FOLLOWUP_EMAIL FOR COLUMN FOLLO00002 VARCHAR(300) CCSID 37 DEFAULT NULL ,
        CREATETIMESTAMP FOR COLUMN CRTTIME    TIMESTAMP DEFAULT NULL ,
        CONSTRAINT IMS.QSYS_ACTIVITY_00001 PRIMARY KEY( "ID" ) )
        ;

CREATE TABLE IMS.ADDRESS (
        "ID" INTEGER NOT NULL ,
        PROVINCESTATE FOR COLUMN PROVI00001 VARCHAR(30) CCSID 37 DEFAULT NULL ,
        CITY VARCHAR(30) CCSID 37 DEFAULT NULL ,
        COUNTRY VARCHAR(30) CCSID 37 DEFAULT NULL ,
        ADDRESSLINE1 FOR COLUMN ADDRE00001 VARCHAR(30) CCSID 37 DEFAULT NULL ,
        ADDRESSLINE2 FOR COLUMN ADDRE00002 VARCHAR(30) CCSID 37 DEFAULT NULL ,
        POSTALCODE VARCHAR(30) CCSID 37 DEFAULT NULL ,
        CONSTRAINT IMS.QSYS_ADDRESS_00001 PRIMARY KEY( "ID" ) )
        ;

从上面的文件中,如果我们搜索CCSID它应该列出包含的行CCSIDCREATE TABLE各自的行CCSIDs

输出应该是这样的

CREATE TABLE IMS.ACTIVITY
OWNING_TYPE FOR COLUMN OWNIN00001 VARCHAR(20) CCSID 37 NOT NULL
ACTIVITY_TYPE FOR COLUMN ACTIV00001 VARCHAR(50) CCSID 37 NOT NULL
CAMPAIGN_TYPE FOR COLUMN CAMPA00001 VARCHAR(50) CCSID 37 NOT NULL
AUTHOR VARCHAR(100) CCSID 37 NOT NULL
"COMMENT" VARCHAR(1000) CCSID 37 DEFAULT NULL
CUR_LOCN_STATUS FOR COLUMN CUR_L00001 VARCHAR(20) CCSID 37 DEFAULT NULL
FOLLOWUP_EMAIL FOR COLUMN FOLLO00002 VARCHAR(300) CCSID 37 DEFAULT NULL

打印包含“table”及其关联的“CCSID”的行(如果出现在下面段落的 () 内)。

答案1

可能有不止一种方法可以做到这一点,但我会:

  1. 使用 tr 删除所有新行,使整个文件成为一长行。
  2. 代替 ; with ;\n 每个查询放置 1 行
  3. Grep 查找您要查找的查询
  4. 根据需要重新格式化结果

这是一个应该可以工作的单衬:

cat filename|tr -d '\n'|sed -e 's/;/;\n/g'|grep CCSID|sed -e 's/,/,\n/g'

仅在输出中包含创建表和 CCSID 列:

cat filename|tr -d '\n'|sed -e 's/;/;\n/g'|grep CCSID|sed -e 's/,/,\n/g'|grep "CCSID\|CREATE TABLE"

更正,使用第二个命令,您最终会得到格式错误的行,这是一个更新的命令(有点长,但我根据您提供的数据与已过滤掉的 DDSID 的修改数据混合进行了测试):

cat testfile|tr -d '\n'|sed -e 's/;/;\n/g'|grep CCSID|sed -e 's/,/,\n/g'|grep "CCSID\|CREATE TABLE"|tr -d '\n'|sed -e 's/CREATE TABLE/;CREATE TABLE/g'|sed -e 's/,$/);/g'|sed -e 's/^;//g'|sed -e 's/,;/);/g'|sed -e 's/;/;\n/g'|sed -e 's/,/,\n/g'

相关内容