【问题标题】:building array with awk and/or shell使用 awk 和/或 shell 构建数组
【发布时间】:2012-09-11 06:45:26
【问题描述】:

我使用以下行从字符串创建字段数组:

var=$(echo $FieldName | awk -F";" '{print $1,$2,$3,$4,$5,$6,$7,$8,$9}')

$FieldName 是一个字符串,其字段由分号分隔。

$FieldName 包含没有空格的字符串时,它会正常运行。 问题是当它包含任何嵌入的空白字符时,脚本会将空白视为换行符。

例如:

$FieldName = aa;bcd;cal;da;ea;fa;ga;ha;ia

给出[aa,bcd,cal,da,ea,fa,ga,ha,ia],这是预期的。

但是$FieldName = aa;bcd;cal;da;ea;fa;ga;ha;ia <= ia2

[aa,bcd,cal,da,ea,fa,ga,ha,ia] , [<=, , , , , , , , ] and [ia2, , , , , , , , ]

有什么想法吗?

【问题讨论】:

  • 你试过在echo中引用$FieldName吗?
  • 这不会改变任何事情。空格仍然会产生同样的问题。
  • 就像@chepner 也暗示的那样,根本问题可能是您使用echo $value 而不是echo "$value" 和正确的双引号。始终引用变量插值,除非您特别要求 shell 对值执行分词和通配符扩展。
  • 我认为问题在于你用$var 做什么——你用$var 做什么?稍后在脚本中使用 $var 时是否引用它?你在用printf吗?

标签: shell awk


【解决方案1】:

你不需要awk:

IFS=\;
set $FieldName
var=$@

【讨论】:

  • set -- $FieldName 好点了吗?
  • 这个解决方案更优雅,但仍然无法解决空格造成的问题
  • @abhayK: $9 将包含“ia
  • 要使用, 连接字符串,请使用this,即IFS=,var="$*"
【解决方案2】:

您似乎正在尝试更改$FieldName 的分隔符,在这种情况下使用awk,如下所示:

echo "$FieldName" | awk -v FS=',' -v OFS=';' 1

1 执行默认块:{ print $0 }

tr:

echo "$FieldName" | tr ';' ','    

输出:

aa,bcd,cal,da,ea,fa,ga,ha,ia <= ia2

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多