테이블 만들기 쿼리가 포함된 .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 )
설명하다
- 패턴 공간에는 주어진 시간에 두 개의 선이 있습니다.
- 첫 번째 필드를 유지하고 두 번째 행의 모든 항목을 삭제합니다.
- 유일한 ) 행에 도달할 때까지 이 작업을 수행합니다.