从逗号分隔的字符串传递值并分配给korn shell中的不同变量

时间:2018-05-16 18:55:09

标签: sql shell teradata ksh

我将SQL查询的结果以逗号分隔的字符串形式导出到变量。如何将字符串中的每个值分配给变量名称并导出。

$SQLOUTPUT_STRING=1,2018-05-16,abc,123

我想将上面的字符串中的值分配给变量并导出它们

export VAR1=1
export VAR2=2018-05-16
export VAR3=abc
export VAR4=123

我在其他脚本中使用这些变量,所以我不能将这些变量命名为如上所述,因此VAR1,VAR2,VAR3,VAR4不会是这种情况,它会有不同的名称。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以在shell脚本中使用cut命令来获取CSV文件的单个字段或整列,每次调用cut命令一个。 cut期望输入CSV数据通过标准输入提供,因此您可以使用“here”文档shell功能将SQLOUTPUT_STRING shell变量的内容显示为stdin。

以下命令序列将分别将值12018-05-16abc123分配给VAR1VAR2

SQLOUTPUT_STRING=1,2018-05-16,abc,123

export VAR1=`cut -d, -f1 <<
$SQLOUTPUT_STRING
EOF
`
export VAR2=`cut -d, -f2 <<
$SQLOUTPUT_STRING
EOF
`
export VAR3=`cut -d, -f3 <<
$SQLOUTPUT_STRING
EOF
`
export VAR4=`cut -d, -f4 <<
$SQLOUTPUT_STRING
EOF
`

注意我已经使用传统的Bourne shell反引号转义来使shell执行反引号中包含的命令并使用其输出作为文字替换值在export语句中就地扩展,因为您特意请求了便携式shell码。现代ksh shell语法中可能存在替代语法和重定向运算符。

答案 1 :(得分:0)

让我们再试一次...假设您的数据中没有嵌入逗号,您可以使用read命令的变体将字符串拆分为变量列表。

要显示此解决方案处理嵌入式空白区域,我们将从您的示例字符串的修改版本开始:

$ input="1,2018-05-16,abc def,asdf 123"

我们现在告诉read使用逗号作为输入字段分隔符(IFS),我们将使用here-string将${input}传递给{{1这给了我们:

read

这应该比我之前的答案(下面)快一点,基于参数替换*加*你不要破坏$ IFS=, read -r VAR1 VAR2 VAR3 VAR4 <<< "${input}" $ echo "${VAR1}" 1 $ echo "${VAR2}" 2018-05-16 $ echo "${VAR3}" abc def $ echo "${VAR4}" asdf 123 的内容。

以上解决方案的bash fiddleksh93 fiddle显示相同的解决方案。

我之前的回答/ ramblings ......

如果您可以使用数组,请在&#34; bash split string into array&#34;上运行搜索。你应该得到几个SO点击来帮助你。

如果你绝对需要使用个别变量,我可能会使用参数替换去除字段。

${input}

将此应用于您的示例字符串,我们得到:

${variable%%,*}      # strip off the first field of a comma-delimited string
${variable#*,}       # strip off fields 2-n of a comma-delimeted string
  • 每个连续的$ input="1,2018-05-16,abc,123" $ VAR1="${input%%,*}" input="${input#*,}" $ VAR2="${input%%,*}" input="${input#*,}" $ VAR3="${input%%,*}" input="${input#*,}" $ VAR4="${input%%,*}" input="${input#*,}" $ echo "${VAR1}" 1 $ echo "${VAR2}" 2018-05-16 $ echo "${VAR3}" abc $ echo "${VAR4}" 123 对将前导字段放入VAR= / input=并更新VAR以包含其余字段
  • 如果您需要在input中保留原始值,则首先将input复制到另一个可以分解的变量中

虽然这可能看起来比使用inputcut删除字段更多的编程,但关键的好处是您不需要生成新的子字段-process(就像你对awkcut解决方案所做的那样)所以你应该发现性能得到了提高(对于大量的输入字符串处理,性能改进应该非常明显。)

显然(?)如果您处理数据a)包含逗号,b)跨越多行和/或c)包含非打印/控制字符,这可能会变得更复杂...... < / p>