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

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

예를 들어:

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: 망치다케이대체할 부품의 시작입니다.
  • (?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_#");

관련 정보