특정 단어로 시작하는 줄을 인쇄하고 나머지 레코드에는 첫 번째 필드만 인쇄하고 싶습니다.

특정 단어로 시작하는 줄을 인쇄하고 나머지 레코드에는 첫 번째 필드만 인쇄하고 싶습니다.

예를 들어:

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모델. (이자형코드 평가이자형한 번에 하나의 레코드를 표현하다나중에 인쇄하세요.)
  • s{...}{...}gse: 바꾸다G전역적으로 문자열을 다음과 같이 처리합니다.에스한 줄( .개행 문자도 일치) 대체 항목은 Perl로 처리됩니다.이자형표현하다이자형평가하다.
  • \K: 3월케이s 교체할 섹션의 시작 부분입니다.
  • (?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_#");

관련 정보