【问题标题】:Take the value of the NAME field and put it in a variable,取 NAME 字段的值并将其放入变量中,
【发布时间】:2013-01-24 12:38:15
【问题描述】:

通过向命令行发出的请求,我得到了 csv 格式的响应。这是文件:

"STACK";"STACK_ID";"NAME";"DESCRIPTION";"CREATION_TIME";"DELETION_TIME";"STATUS"
"STACK";"arn:aws:cloudformation:us-west-1:222222222222:stack/LiveStream2/00000000-6000-00e2-acd3-333333333333";"LiveStream2";"(nil)";"2013-01-23T16:01:36Z";"2013-01-23T16:22:57Z";"DELETE_COMPLETE"
"STACK";"arn:aws:cloudformation:us-west-1:444444444444:stack/LiveStream/00000000-6000-00e2-acd3-222222222222";"LiveStream";"(nil)";"2013-01-23T13:53:13Z";"2013-01-23T15:20:29Z";"DELETE_COMPLETE"

我想通过脚本获取 NAME 字段的值并将其放入变量中, 你能帮帮我吗?

【问题讨论】:

  • 您想对示例输出做什么,包括 2 个名称值。使用第一个,最后一个或两者。如果您有超过 2 行的数据怎么办?作为上述问题的一部分,回答这些问题。祝你好运。
  • NAME 值只有一个,用分号隔开。

标签: linux bash csv


【解决方案1】:

如果你不知道 NAME 是第三个字段,你必须在标题行中寻找它:

awk -F \; '
    NR==1 {
        for (i=1; i<=NF; i++) {
            if ($i == "\"NAME\"") {
                name_field = i
                break
            }
        }
        next
    }
    { print $name_field }
' < filename

这个输出

"LiveStream2"
"LiveStream"

【讨论】:

    【解决方案2】:

    那么 cut 命令应该很适合你: 例如,如果您的文件是test.txt

    cat test.txt| cut -d';' -f3 将获得字段 3。

    如果要逐行存储值,请使用:

    for i in `cat test.txt`
    do
      MYVAR=$(echo $i| cut -d';' -f3)
      //do something with the variable $MYVAR
    done
    

    注意:这只是解决您问题的一种方法。有几种方法可以实现您的要求。

    【讨论】:

      【解决方案3】:

      这是示例代码。

      #!/bin/sh
      OLDIFS=$IFS
      IFS=;
      while read f1 f2 f3 
      do
           echo "Name variable is              :$f3"
      
      done<filename.csv
      IFS=$OLDIFS
      

      第三个字段是“NAME”,它在 f3 的变量中赋值。这里变量显示了两次。

      【讨论】:

      • 这里的IFS应该是分号。
      【解决方案4】:

      Awk 是我最好的选择。

      declare NAMES=( $( cmd_that_generates_output | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};  printf $3 " " }' ) )
      

      因此 bash 执行命令替换,即 $( ) 中的所有内容,cmd 生成您的 csv 并将其通过管道传递给 awk。

      Awk 检查输入是否是第一行 (NR==1),如果是则继续前进 ({next})

      对于其他每一行,它都会检查它是否正确地包含在引号中

      if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};
      

      然后打印出由 ';' 分隔的第三列(即 naem 列)后跟一个空格。

      printf $3 " " 
      

      然后将 $() 扩展为以空格分隔的名称列表,例如

      declare NAMES=( name1 name2 )
      

      然后执行声明,它创建一个名为 NAMES 的数组,每个名称都作为一个元素。所以:

      x.txt 是您在问题中给出的输出。

      pete.mccabe@jackfrog$ cat x.txt 
      "STACK";"STACK_ID";"NAME";"DESCRIPTION";"CREATION_TIME";"DELETION_TIME";"STATUS"
      "STACK";"arn:aws:cloudformation:us-west-1:222222222222:stack/LiveStream2/00000000-6000-00e2-acd3-333333333333";"LiveStream2";"(nil)";"2013-01-23T16:01:36Z";"2013-01-23T16:22:57Z";"DELETE_COMPLETE"
      "STACK";"arn:aws:cloudformation:us-west-1:444444444444:stack/LiveStream/00000000-6000-00e2-acd3-222222222222";Live Stream;"(nil)";"2013-01-23T13:53:13Z";"2013-01-23T15:20:29Z";"DELETE_COMPLETE"
      
      pete.mccabe@jackfrog$ declare NAMES=( $( cat x.txt | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};  printf $3 " " }' ) )
      
      pete.mccabe@jackfrog$ echo ${NAMES[@]}
      "LiveStream2" "Live Stream"
      

      【讨论】:

        猜你喜欢
        • 2019-06-20
        • 2021-06-26
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        相关资源
        最近更新 更多