ich möchte die Zeile drucken, die mit einem bestimmten Wort beginnt, und in den restlichen Datensätzen nur das 1. Feld drucken

ich möchte die Zeile drucken, die mit einem bestimmten Wort beginnt, und in den restlichen Datensätzen nur das 1. Feld drucken

zum Beispiel:

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 );

Im obigen Beispiel möchte ich die Zeile drucken, die mit CREATE TABLE beginnt, und in der restlichen Zeile nur das erste Feld drucken.

Ich möchte eine Ausgabe wie

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

Antwort1

Mit awk:

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

Dabei wird davon ausgegangen, dass die Anweisungen CREATE TABLEam Zeilenanfang mit beginnen und );am Zeilenende (aber nicht in derselben Zeile) mit enden und dass jeder Spaltenname das erste Feld der nachfolgenden Zeilen ist (was bedeutet, dass Spaltennamen keine Leerzeichen enthalten dürfen).

Antwort2

Klingt eher nach einem Job für perl:

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

(Dies setzt voraus, dass die zitierten Zeichenfolgen keine nicht übereinstimmenden Klammern enthalten und dass eine einigermaßen aktuelle Version von vorliegt perl.)

Heruntergebrochen:

  • -0777, setzen Sie den Datensatztrenner auf 0777 (ein unmöglicher Byte-Wert), wodurch in der Tat dieschlürfenModus, der perlauf die gesamte Eingabe als Ganzes einwirkt.
  • -pe 'code': sedModus. (twertet den Code austxpression einen Datensatz nach dem anderen undPdruckt es anschließend aus).
  • s{...}{...}gse: ErsatzGlobally, behandelt Zeichenfolge alsSingle line ( .entspricht auch Zeilenumbruchzeichen), und die Ersetzung ist als Perl zu behandelntAusdruck zutbewerten.
  • \K: Märzks der Beginn des zu ersetzenden Teils.
  • (?2): eine Möglichkeit, rekursive reguläre Ausdrücke zu erstellen. Hier ist der in der zweiten (...)Gruppe eingeschlossene reguläre Ausdruck enthalten. Also \((:(?2)|.)*?\). Ist ein (gefolgt von einer Folge weiterer (...)Gruppen oder anderer Zeichen (so wenig wie möglich), gefolgt von ).
  • join(",", $2 =~ /".*?"/g)verbindet die Liste der übereinstimmenden Zeichenfolgen ".*?"(also der in Anführungszeichen gesetzten Zeichenfolgen) $2mit einem Komma.

Antwort3

Verwendung von awk:

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

Erste Übereinstimmung, wenn wir uns in der ersten Eingabezeile befinden. Wenn ja, drucken Sie die ganze Zeile, andernfalls drucken Sie das erste Wort, gefolgt von einem Komma.

Als letzten Schritt drucken Sie eine Rücktaste, um das letzte Komma zu entfernen und die schließende Klammer und eine neue Zeile zu drucken. Das Rücktaste-Zeichen wird mithilfe von in die Befehlszeile eingefügt ctrl+vctrl+h. Die ctrl+hTaste entspricht dem 8. Buchstaben des Alphabets (H) und der Tastencode 8 entspricht einer Rücktaste.

Die Ausgabe lautet:

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

verwandte Informationen