同时使用awk和postgresql的程序副本

o0lyfsai  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(260)

我有一个由数千行组成的.dat文件,其中每行由4组数字组成,用 :: . 最后看起来像这样:

1234::482::4::1342.5321234
4342::532::1::1532.532431

我正试图用copy from程序把这个文件复制到postgres表中。顺便说一句,我使用的是postresql9.5。我之所以尝试使用program选项是因为我只需要每行的前3组数字。我发现我可以使用awk命令来打印我想在终端上复制的内容 awk -F '::' '{print $1, $2, $3}' my_file.dat 所以我想我可以通过awk命令从程序中复制,并将前3组数字导入到我的数据库表中,该表只有3列。
但是,当我尝试将此命令与copy from一起使用时,总是会出现错误。我尝试在psql中运行以下命令 COPY my_table FROM PROGRAM 'awk -F ''::'' ''{print $1''%''$2''%''$3}'' my_file.dat' delimiter '%'; 但不断出现错误: ERROR: program "awk -F '::' '{print $1'%'$2'%'$3}' my_file.dat" failed DETAIL: child process exited with exit code 2 . 我试过用不同的定界符做各种各样的变化,但我一辈子都搞不清楚哪里出了问题。我是不是误解了程序的拷贝能做什么?还是我遗漏了什么?
我无法在系统上创建新文件,因此无法运行命令来筛选该文件并创建具有所需格式的新文件。我需要能够在一行sql代码中编写这个,并且认为从程序复制实际上是一种非常酷的方法,但是我无法让它工作。

dz6r00yl

dz6r00yl1#

在awk中,退出代码2可能意味着它无法打开输入文件。这是有意义的,因为copy在服务器端寻找文件,在服务器进程的当前工作目录中,该目录可能不是文件所在的位置。改为使用\copy在psql的当前工作目录中查找文件。由awk生成的实际错误消息应该在数据库服务器的日志文件中找到(与copy一起使用时;当与\copy一起使用时,它应该显示在psql的stderr上)。
为什么不运行您已经测试过的awk命令,而不是创建一个新的未测试的命令呢?

\COPY my_table FROM PROGRAM 'awk -F ''::'' ''{print $1,$2,$3}'' my_file.dat' delimiter ' '
stszievb

stszievb2#

如果 awk 正在返回正确的结果集,可以尝试使用 STDIN (标准输入)来自 COPY 而不是执行 awk 从postgresql内部,例如。

awk -F "::" '{print $1"%"$2"%"$3}' ratings_copy.dat | psql -d db "COPY my_table FROM STDIN"

此命令接受 awk 把它输送到 psql ,然后 COPY FROM . 另一种选择是使用 \copy ;-)

相关问题