何百ものテーブルとそのデータを含む1.4GBの古いpostgresqlダンプがあります。
このファイルでは、すべてのテーブル生成ステートメントが最初にすべてのデータ挿入につながります。
以下を使用してファイルを2つに分割できます。
file_name=synapse.sql
# devider:
STR='-- Data for Name:'
# number of lines befotre the devider that should get into the bottom file already:
D=2
# get first occurrence of devider:
K=$(grep -n -- $STR $file_name |head -1|cut -d":" -f1)
# line count (N):
N=$(wc -l < $file_name)
# length of the bottom file:
L=$(( $N - $K + $D))
# create the top of file:
head -n $K $file_name > top_$file_name
# create bottom of file:
tail -n $L $file_name > bottom_$file_name
(源泉:https://stackoverflow.com/a/3066968/1069083)
これで最上位のファイルは次のようになります。
--
-- Name: access_tokens; Type: TABLE; Schema: public; Owner: someone
--
CREATE TABLE access_tokens (
...
);
ALTER TABLE access_tokens OWNER TO "someone";
--
-- Name: application_services; Type: TABLE; Schema: public; Owner: someone
...
下のファイルは次のとおりです。
--
-- Data for Name: access_tokens; Type: TABLE DATA; Schema: public; Owner: someone
--
COPY access_tokens (id, user_id, device_id, token, last_used) FROM stdin;
4 @dagobertderkaufhauserpresser:matrix.test.com \N MDAxZWxvY2F0aW9uIG1hdHJpeC5lY2xhYnMuZGUKMDAxM2lkZW50aWZpZXIga2V5CjAwMTBjaWQgZ2VuID0gMQowMDQxY2lkIHVzZXJfaWQgPSBAZGFnb2JlcnRkZXJrYXVmaGF1c2VycHJlc3NlcjptYXRyaXguZWNsYWJzLmRlCjAwMTZjaWQgdHlwZSA9IGFjY2VzcwowMDFkY2lkIHRpbWUgPCAxNDU2ODY5OTY0MDk0CjAwMmZzaWduYXR1cmUgqG8q57PffosB-Aob1Szapvu-Bd7j9Sve9-6nPz7hL8QK \N
5 @wobwob:matrix.test.com \N MDAxZWxvY2F0aW9uIG1hdHJpeC5lY2xhYnMuZGUKMDAxM2lkZW50aWZpZXIga2V5CjAwMTBjaWQgZ2VuID0gMQowMDJiY2lkIHVzZXJfaWQgPSBAd29id29iOm1hdHJpeC5lY2xhYnMuZGUKMDAxNmNpZCB0eXBlID0gYWNjZXNzCjAwMWRjaWQgdGltZSA8IDE0NTY4NzM3MTI3NzMKMDAyZnNpZ25hdHVyZSB-PHutqfj3BAB6Mtop5qdiAz70YGSL2Wz7v1w4gj83Zgo \N
...
下のファイルをそれぞれテーブル名をファイル名として使用する別々のファイルに分割するにはどうすればよいですか?
答え1
csplit -s -f file. bottom_$file_name '/^-- Data for Name:/-1' '{*}'
grep -oP '^-- Data for Name:\s*\K[^;]+' file.* | tr ':' ' ' | xargs -l -t mv
新しいディレクトリに作成した一番下のSQLファイルを配置します。次に、csplit
複数のファイルに分割してfile.nnn
型名に入れます。次に、grep
分割ファイルからテーブル名をxargs
取得しますmv
。