테이블 생성 쿼리에서 테이블 열 추출

테이블 생성 쿼리에서 테이블 열 추출

테이블 만들기 쿼리가 포함된 .sql 파일이 있습니다.

<<<<< some text >>>>>
CREATE EXTERNAL TABLE table_name
(
    key1                   int ,
    key2                varchar(256),
    key3                   int ,
    key4            varchar(64),
    key5                   int ,
)
<<<<<<< some text >>>>>>>>

이제 쉼표로 구분하고 대괄호로 묶은 문자열의 열 이름을 원합니다. 즉, 위의 테이블에 대해 다음을 원합니다.

( key1, key2, key3, key4, key5 )

제가 생각하는 바에 따르면 상황이 매우 복잡해집니다. 이와 같은 파일이 150개 있고 그 중 열이 약 300개 있는 파일은 거의 없기 때문에 이 스크립트를 작성하고 싶습니다. 손으로 쓰는 것은 좋은 생각이 아닙니다. 누군가 더 쉬운 방법을 제안할 수 있습니까? 감사해요!

답변1

이것은 작동합니다

Old_IFS=$IFS
IFS=$'\n'

file=`cat file.sql` > /dev/null

for line in $file
do

    temp=`echo "$line" | awk '{print $1}'`


    if [[ "$temp" == "create" ]] || [[ "$temp" == "" ]]
    then
        echo ""

    elif [[ "$temp" == "(" ]]
    then
        printf "$temp"
    elif [[ "$temp" == ")" ]]
    then
        printf "$temp\n"
    else
        printf "$temp,"
    fi
done

IFS=$Old_IFS


exit 0

이 코드를 사용하여 스크립트를 생성하고 "file.sql"을 파일로 바꾸면 필요한 것을 얻을 수 있습니다.

물론 파일의 전체 구조는 모르지만, 다른 일을 피하고 싶다면 if 문에 절을 추가하세요.

temp 변수는 각 행의 첫 번째 인스턴스를 저장하며, 이를 기반으로 행을 유지할지 여부를 선택할 수 있습니다.

답변2

sed -Ee '
   /^CREATE EXTERNAL TABLE/!d
   s/.*//
   :loop
      $!N
      s/(\n\()\n\s*(\S+).*\s.*\S.*/\2, \1/
   /\n\)$/!bloop
   s/(.*), \n\(\n\)$/( \1 )/
' filename.sql

결과

( key1, key2, key3, key4, key5 )

설명하다

  • 패턴 공간에는 주어진 시간에 두 개의 선이 있습니다.
  • 첫 번째 필드를 유지하고 두 번째 행의 모든 ​​항목을 삭제합니다.
  • 유일한 ) 행에 도달할 때까지 이 작업을 수행합니다.

관련 정보