我想列印以特定單字開頭的行,並在其餘記錄中僅列印第一個字段

我想列印以特定單字開頭的行,並在其餘記錄中僅列印第一個字段

例如:

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_#");

相關內容