테이블 이름이 첫 번째 열이고 필드가 두 번째 열인 파일에서 SQL 스크립트를 만듭니다.

테이블 이름이 첫 번째 열이고 필드가 두 번째 열인 파일에서 SQL 스크립트를 만듭니다.

공백으로 구분된 두 개의 열이 포함된 텍스트 파일이 있습니다.

Foo Param1
Foo Param2
Foo Param3
Foo Param4
Foo Param5
Bar Stuff1
Bar Stuff2
Bar Param3
Bar Stuff4
etc

첫 번째 열은 그룹 이름이고 두 번째 열은 해당 그룹 내의 고유 속성입니다(속성 이름은 두 개의 서로 다른 그룹에 나타날 수 있지만 이는 정상입니다).

이 파일에서 다음과 같은 SQL 파일을 만들 수 있기를 바랍니다.

CREATE TABLE "Foo" (
   id SERIAL PRIMARY KEY,
   Param1 text,
   Param2 text,
   Param3 text,
   Param4 text,
   Param5 text
);
CREATE TABLE "Bar" (
   id SERIAL PRIMARY KEY,
   Stuff1 text,
   Stuff2 text,
   Param3 text,
   Stuff4 text
);

테이블 이름은 파일의 첫 번째 열에서 가져오고 두 번째 열은 생성할 필드로 사용됩니다.

내가 지금까지 시도한 것은이것스레드는 다음과 같습니다.

awk -F ' ' 'BEGIN{IFS=","}NR>1{arr[$1]++}END{for (a in arr) print "CREATE TABLE IF NOT EXISTS " a " (" ${arr[*]} " )"}' file.txt

그러나 이것은 분명히 작동하지 않습니다.

bash/Ubuntu 22.04에서 이를 달성하는 쉬운 방법이 있습니까?


배경용:다음을 사용하여 이미지 메타데이터를 추출했습니다.exiftool하나 먹여주고 싶다포스트그레SQL각 데이터베이스에는 하나의 테이블이 있습니다.그룹레벨 0에서는 모든 태그가 속성으로 발견됩니다.

따라서 텍스트 파일의 첫 번째 열은 EXIF, XMP또는 과 같은 그룹 이름에 해당하고 ICC_Profile, EXIF그룹의 경우 두 번째 열에는 , 등과 Artist같은 값이 있습니다.ColorSpaceFNumber

답변1

하지 마세요. 이것은 매우 나쁜 디자인 패턴입니다. 소스 데이터 파일에 새로운 "그룹 값" 쌍이 있거나 누락된 경우 해당 그룹에 대한 테이블을 다시 작성하시겠습니까? 그룹이 몇 개 있나요? 이것이 작은 상수라는 것이 확실합니까? 테이블 이름을 어떻게 매개변수화할 계획인가요?

이미 가지고 있는 데이터를 따르는 테이블을 생성하면 됩니다.

create table data (
   group text,
   flag text,
   comment text,
   primary key(group, flag)
);

EAV 데이터베이스 스키마를 이해합니다.https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

답변2

여기요. 형식은 정확히 원하는 형식은 아니지만 PostgreSQL은 이에 만족해야 한다고 생각합니다.

awk '
    # continuation lines separated by comma
    $1 == table { print "," }

    # new table needs preamble
    $1 != table {
        # may need to finish previous definition
        if(table > "") { print ");" }

        # preamble
        table=$1;
        printf "create table \"%s\" (\n", table
        print "id SERIAL PRIMARY KEY,"
    }

    # field
    { printf "%s text\n", $2 }

    # close final table
    END { print ");" }
' datafile

답변3

awk를 사용하십시오.

$ cat tst.awk
$1 != prev {
    printf "%sCREATE TABLE \"%s\" (\n   id SERIAL PRIMARY KEY", end, $1
    end = "\n);\n"
    prev = $1
}
{ printf ",\n   %s text", $2 }
END { printf "%s", end }

$ awk -f tst.awk file
CREATE TABLE "Foo" (
   id SERIAL PRIMARY KEY,
   Param1 text,
   Param2 text,
   Param3 text,
   Param4 text,
   Param5 text
);
CREATE TABLE "Bar" (
   id SERIAL PRIMARY KEY,
   Stuff1 text,
   Stuff2 text,
   Param3 text,
   Stuff4 text
);

관련 정보