如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

Posted

技术标签:

【中文标题】如何将字符串列分配给变量并在 Bash 脚本的输出中引用它【英文标题】:How to assign a string column to variable and have it quoted in output in Bash script 【发布时间】:2021-06-18 15:39:08 【问题描述】:

在这个post 中,我问了一个问题,关于如何让我的脚本读取 CSV 标头和 auto-quote 字符串值;即自动包装那些数据类型为字符串并且需要 "" 才能插入 SQL 表的列。显然,这超出了 Bash 的处理能力?

无论如何,我欢迎任何有关如何使以下脚本工作的帮助:在这里,我有基本相同的脚本,但我尝试手动定义单独的列并将它们分配给col3 为字符串列的变量,因此被引用。不用说,它并没有做我想要做的事情(即给我 col3 下所有字符串数据的引用值)。谢谢!

#!/bin/bash

echo Path to to-be-imported CSV:
read csv_file
echo Table name to import into:
read table

echo "INSERT INTO $table VALUES" > SQL_INSERT_$table.txt
while read col1 col2 col3 col4
do
 echo "($col1 $col2 "$col3" $col4),"
done < <(tail -n +2 $csv_file) >> SQL_INSERT_$table.txt && sed -i '' '$ s/.$/;/' SQL_INSERT_$table.txt

【问题讨论】:

这能回答你的问题吗? How to auto-quote "string values" of a SQL INSERT STATEMENT in Bash script 您期望的输出(示例)是什么?也许您可以使用printf "(%q, %q, %q, %q)" "$col1" "$col2" "$col3" "$col4") 而不是引用自己? 感谢@NoDataFound。但是我仍然需要提前确定我想要引用哪些列,对吧?我最初的问题是是否有办法识别字符串列并自动引用它们(在脚本的一部分),这样我就可以将整个标题提供给单个变量。 @KayGee 您使用的是哪个数据库?也许这些答案会有所帮助 - ***.com/questions/13405572/… 这能回答你的问题吗? How do I use variables in single quoted strings? 【参考方案1】:

给定以下 csv 文件:

/tmp/csv:

Year,Make,Model,Description,Price
1997,Ford,E350,moon,-3000.00
1997,Ford,E350,moon,3000.00
1999,Chevy,Venture Extended Edition,,4900.00
1999,Chevy,Venture Extended Edition Very Large,,5000.00

还有代码:

awk -F, 'OFS=FS for (i=1;i<=NF;i++) if (match($i, /^[0-9.-]+$/)==0) printf "\"" $i "\"" else printf $i; if (i<NF) printf OFS; printf "\n"' /tmp/csv

它输出:

所有字符串类型的值都用引号引起来。

"Year","Make","Model","Description","Price"
1997,"Ford","E350","moon",3000.00
1999,"Chevy","Venture Extended Edition","",4900.00
1999,"Chevy","Venture Extended Edition Very Large","",5000.00

代码基于以下假设:

字段值内没有文字分隔符(此处为逗号)。 字段值内没有文字换行符。 整数或小数字段没有空值。

如果假设不适合您的数据,您可能需要像 this 这样的 CSV 解析器。并且应该很好地引用异常字段值,否则即使解析器也不知道该怎么做。

顺便说一句:除非您的数据非常简单并且行数很少,否则不推荐使用这种方法来操作数据。许多 DBMS 都有一个导入/加载实用程序,可以在程序中使用它来完成这样的工作。

【讨论】:

以上是关于如何将字符串列分配给变量并在 Bash 脚本的输出中引用它的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Bash 命令的输出分配给变量? [复制]

我如何使用bash将带有参数*的函数输出分配给变量?

如何将curl的输出捕获到bash中的变量[重复]

期望脚本:获取 bash 命令的输出并设置变量

如何将 exe 输出分配给 gitlab ci 脚本中的变量?

如何将字符串列添加到python中的另一个字符串?