awk拆分了另一个令牌

时间:2013-11-25 15:19:37

标签: bash awk

我正在尝试使用awk从字符串拆分初始化数组。 我期待令牌被“,”分隔,但不知何故他们没有。

输入是curl从地址http://www.omdbapi.com/?i=&t=the+campaign返回的字符串 我试图删除任何额外的回车或可能导致混淆的事情,但在我检查过的所有客户端看起来都是单行字符串。

{"Title":"The Campaign","Year":"2012","Rated":"R", ...

这是输出

    -metadata {"Title":"The **-metadata** Campaign","Year":"2012","Rated":"R","....

应该是

   -metadata {"Title":"The Campaign"

这是我的代码:

__tokens=($(echo $omd_response | awk -F ',' '{print}'))
for i in "${__tokens[@]}"
  do
    echo "-metadata" $i"
done

欢迎任何帮助

2 个答案:

答案 0 :(得分:2)

我会认真对待@cbuckley的评论:使用json感知工具,而不是尝试使用简单的字符串工具解析该行。否则,如果带引号的字符串中包含逗号,则脚本将中断,例如。

无论如何,此练习不需要awk,但它没有帮助您,因为awk打破字符串的方式只对awk感兴趣。将字符串打印到stdout后,它仍然是一直相同的字符串。如果您希望shell使用,作为字段分隔符,则必须告诉shell执行此操作。

这是一种方法:

(
  OLDIFS=$IFS
  IFS=,
  tokens=($omd_response)
  IFS=$OLDIFS

  for token in "${tokens[@]}"; do
    # something with token
  done
)

()只是执行子shell中的所有操作,使shell变量成为临时变量。你可以不用。

答案 1 :(得分:1)

首先,请接受我的道歉:我手边没有最近的bash,所以我无法尝试下面的代码(没有数组!)

但它应该工作,或者如果没有,你应该能够调整它工作(或在下面询问,提供你所看到的一些上下文,我会帮助解决它)< / p>

nb_fields=$(echo "${omd_response}" | tr ',' '\n' | wc -l | awk '{ print $1 }')
  #The nb_fields will be correct UNLESS ${omd_response} contains a trailing "\", 
  #in which case it would be 1 too big, and below would create an empty 
  # __tokens[last_one], giving an extra `-metadata ""`. easily corrected if it happens.

#the code below assume there is at least 1 field... You should maybe check that.

#1) we create the __tokens[] array
for field in $( seq  1 $nb_fields )
do
   #optionnal: if field is 1 or $nb_fields, add processing to get rid of the { or } ?
   ${__tokens[$field]}=$(echo "${omd_response}" | cut -d ',' -f ${field})
done

#2) we use it to output what we want
for i in $( seq  1 $nb_fields )
do
   printf '-metadata "%s" '   "${__tokens[$i]}"
      #will output all on 1 line. 
      #You could add a \n just before the last ' so it goes each on different lines
done

所以我循环使用字段编号,而不是可能是某些空格或制表符分隔的值