공백으로 구분된 두 개의 열이 포함된 텍스트 파일이 있습니다.
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
같은 값이 있습니다.ColorSpace
FNumber
답변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
);