mysql - 需要在SHELL的MySQL输出中添加分隔符

标签 mysql shell unix

首先,由于我的 MySQL 用户在服务器上没有 FILE 权限,我必须使用下面的行将 SELECT 语句输出通过管道传输到 shell 中的文件,而不是直接在 MySQL 中执行并能够使用INTO OUTFILE & FIELDS TERMINATED BY '|' 我猜这会解决我所有的问题。

所以我有以下行来获取我的字段:

echo "select id, UNIX_TIMESTAMP(time), company from database.table_name"  | mysql -h database.mysql.host.com -u username -ppassword  user > /root/sql/output.txt

这会输出以下 3 列:

63  1414574321  person one

50  1225271921  Another person

8   1225271921  Company with many names

10  1414574567  Person with Company

然后我在其他脚本中使用该数据来执行一些任务。

我的问题是,某些列(其中第三列“公司”是一个示例)的数据中包含空格,这意味着我的 WHILE 循环稍后会被抛出。

我想在输出中添加一个分隔符,使其看起来像这样:

63|1414574321|person one

50|1225271921|Another person

8|1225271921|Company with many names

10|1414574567|Person with Company

这样我以后就可以使用 awk -F|IFS=| 来操作 block 中的数据。

当我让它工作时,还有很多具有可变长度和字数的列要添加到列中,因此我无法使用依赖于位置的方法来添加分隔符。

我觉得在第一次转储数据时需要设置分隔符。

我尝试过以下方法:

echo "select (id, + '|' + UNIX_TIMESTAMP(time), + '|' + company) from database.table_name"  | mysql -h database.mysql.host.com -u username -ppassword  user > /root/sql/output.txt

没有任何运气,它只是将字符添加到输出文件的标题中。

有人能找到我能做的解决方案吗?

如果有人想知道,我正在从两个数据库转储数据,比较时间戳并将最新数据写回两个数据库。

最佳答案

您可以使用 concat_ws 函数来接收每行一个串联字符串:

select concat_ws( '|', id, UNIX_TIMESTAMP(time) , company ) from database.table_name

编辑:添加了缺少的逗号,抱歉!

关于mysql - 需要在SHELL的MySQL输出中添加分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26631380/

相关文章:

mysql - 优化查询 - 从同一个子查询中选择 COUNT 和 SUM

Android - 单击按钮时插入 mysql 数据库

mysql - 仅在自增 id 不等于 6 时才插入(例如)?

linux - 从检查 ls-l 输出中删除文件的能力

unix - 为什么不通过管道将文件名列表导入 cat?

php - 从php mysql表中删除数据

linux - 递归文件移动

java - 如何自动、定期地将文件从windows机器上传到unix服务器?

bash - 如何搜索具有特定模式的 3 行组?

c++ - unix域流套接字发送更多数据,那么它应该是