#!/bin/bash echo "CAT_HEADER,SUPPLIER_CODE,CUSTOMER_CODE,F4,F5,F6,F7,F8 CAT_LINE,0001P,ABC12345,20190924,,1,Z,3.36 CAT_LINE,0002P,ABC12345,20190924,,1,Z,3.36 CAT_LINE,0001P,ABC23456,20190924,,1,Z,2.24 CAT_LINE,0002P,ABC23456,20190924,,1,Z,2.24 CAT_LINE,0001P,ABC34567,20190924,,1,Z,2.24 CAT_LINE,0002P,ABC34567,20190924,,1,Z,2.24" > data.txt head -n 1 data.txt | perl -ne 'chomp; print " drop table if exists pm11107044 ; create table pm11107044 (" . join(",", map {"\"$_\" text"} split(/,/, $_)) . ");"; ' | psql -qX && < data.txt psql -qXc "copy pm11107044 from stdin with (format csv, header true);" echo "-- unordered data.txt:" cat data.txt echo echo "-- ordered data:" echo "select * from pm11107044 order by 2, 3" | psql -qX --csv # | md5sum echo # older psql doesn't have --csv (introduced in postgres 13); in that case use: # echo "copy(select * from pm11107044 order by 2, 3) to stdout with (format csv, delimiter ',', header true)" | psql -qX #### ./pm.pl -- unordered data.txt: CAT_HEADER,SUPPLIER_CODE,CUSTOMER_CODE,F4,F5,F6,F7,F8 CAT_LINE,0001P,ABC12345,20190924,,1,Z,3.36 CAT_LINE,0002P,ABC12345,20190924,,1,Z,3.36 CAT_LINE,0001P,ABC23456,20190924,,1,Z,2.24 CAT_LINE,0002P,ABC23456,20190924,,1,Z,2.24 CAT_LINE,0001P,ABC34567,20190924,,1,Z,2.24 CAT_LINE,0002P,ABC34567,20190924,,1,Z,2.24 -- ordered data: CAT_HEADER,SUPPLIER_CODE,CUSTOMER_CODE,F4,F5,F6,F7,F8 CAT_LINE,0001P,ABC12345,20190924,,1,Z,3.36 CAT_LINE,0001P,ABC23456,20190924,,1,Z,2.24 CAT_LINE,0001P,ABC34567,20190924,,1,Z,2.24 CAT_LINE,0002P,ABC12345,20190924,,1,Z,3.36 CAT_LINE,0002P,ABC23456,20190924,,1,Z,2.24 CAT_LINE,0002P,ABC34567,20190924,,1,Z,2.24