【问题标题】:Passing values from comma seperated string and assigning to different variables in korn shell从逗号分隔的字符串中传递值并分配给 korn shell 中的不同变量
【发布时间】:2018-10-26 22:29:02
【问题描述】:

我正在将 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 不会是这种情况,它会是不同的名称。

提前致谢。

【问题讨论】:

  • 到目前为止你尝试过什么?您遇到了什么错误或遇到了什么问题?如果您包含代码,将更容易提供帮助。 How do I ask a good question?

标签: sql shell teradata ksh


【解决方案1】:

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

为了展示此解决方案如何处理嵌入的空白,我们将从您的示例字符串的修改版本开始:

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

我们现在告诉 read 使用逗号作为输入字段分隔符 (IFS),我们将使用 here-string 将 ${input} 传递给 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

这应该比我之前基于参数替换的答案(如下)快一点 *plus* 你不会破坏${input} 的内容。

bash fiddle 表示上述解决方案,ksh93 fiddle 表示相同的解决方案。


我之前的回答/胡言乱语...

如果您可以使用数组,请在“bash split string into array”上运行搜索,您应该会得到几个 SO 命中来帮助您。

如果您绝对肯定需要使用单个变量,我可能会使用参数替换来去除字段。

${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 中的原始值,则首先将 input 复制到另一个可以拆分的变量中

虽然这可能看起来比使用 cutawk 去除字段更像是编程,但主要好处是您不需要生成新的子流程(就像您一样对于cutawk 解决方案),因此您应该会发现性能有所提高(对于大量输入字符串处理,性能提高应该非常明显)。

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

【讨论】:

  • 非常感谢您的回复,我已经使用数组和案例来做到这一点,但我想我会用您的解决方案替换它。
【解决方案2】:

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

以下命令序列将分别将值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 语法中可能存在替代语法和重定向运算符。

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多