特定の単語で始まる行を印刷し、残りのレコードには最初のフィールドだけを印刷したいと思います。

特定の単語で始まる行を印刷し、残りのレコードには最初のフィールドだけを印刷したいと思います。

たとえば、

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(不可能なバイト値)に設定するため、実際に開きます。喫煙perlフル入力に作用するモードです。
  • -pe 'code'sedモデル。 (金利コード評価金利一度に1つのレコードを表現する後で印刷してください。)
  • s{...}{...}gse:変えるGグローバルに文字列を次のように処理します。S1行(.改行文字も一致)置換項目はPerlとして扱われます。金利表現する金利評価する。
  • \K:3月K■交換するセクションの先頭です。
  • (?2): 再帰的な正規表現を実行する方法です。 2番目のグループ(...)に含まれる正規表現がここに含まれます。だから\((:(?2)|.)*?\)。は、(一連の追加(...)グループまたはその他の文字(できるだけ少ない数)の後にあります)
  • 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_#");

関連情報