我想打印以特定单词开头的行,并在其余记录中仅打印第一个字段

我想打印以特定单词开头的行,并在其余记录中仅打印第一个字段

例如:

CREATE TABLE MWWDATA."VTCat02" (
    "ID" NUMBER(10) DEFAULT NULL ,
    "Cat" VARCHAR2(255) DEFAULT NULL ,
    "Style_Code" VARCHAR2(255) DEFAULT NULL ,
    "Vendor_Style_#" VARCHAR2(255) DEFAULT NULL );

在上面的示例中,我想打印以 CREATE TABLE 开头的行,并在其余行中仅打印第一个字段。

我想要像这样的输出

CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");

答案1

awk

awk '/^CREATE TABLE/{
       inside = 1
       sep = ""
       printf "%s", $0
       next
     }
     inside {
       printf "%s", sep $1
       sep = ","
       if (/\);$/) {
         print ");"
         inside = 0
       }
     }'

该依赖于那些从CREATE TABLE行首开始,到);行尾结束(尽管不是同一行)的语句,并且每个列名是后续行的第一个字段(意味着列名不能包含空白)。

答案2

听起来更像是一份工作perl

perl -0777 -pe 's{(CREATE TABLE \S+\s+)\K(\((?:(?2)|.)*?\))}
  {"(" . join(",", $2 =~ /".*?"/g) . ")"}gse'

(假设引用的字符串不包含不匹配的括号和合理的最新版本perl)。

细分:

  • -0777,将记录分隔符设置为 0777(不可能的字节值),因此实际上打开了吸食模式 whereperl作用于整个输入。
  • -pe 'code'sed模式。 (e评估代码e一次表达一条记录p之后再打印)。
  • s{...}{...}gse: 代替G全局上,将字符串视为s单行(.也匹配换行符),并且替换将被视为 perle表达到e评估。
  • \K: 三月ks 要替换的部分的开始。
  • (?2):执行递归正则表达式的一种方法。这里包括第二(...)组中包含的正则表达式。所以\((:(?2)|.)*?\)。是 a(后跟一系列更多(...)组或其他字符(尽可能少),后跟)
  • join(",", $2 =~ /".*?"/g)用逗号连接匹配的字符串列表".*?"(即带引号的字符串) 。$2

答案3

使用awk

awk '{if (NR==1) {printf "%s", $0} else {printf "%s,",$1}} END {printf "^H);\n"}' /tmp/inputfile

如果我们在输入的第一行,则首先匹配,如果是,则打印整行,否则打印第一个单词,后跟逗号。

最后一步,打印一个退格键以删除最后一个逗号并打印右大括号和换行符。退格字符使用 插入到命令行中ctrl+vctrl+h。该ctrl+h键对应于字母表中的第 8 个字母 (H),键码 8 对应于退格键。

输出将是:

CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");

相关内容