【问题标题】:Extract value of column from a line (variable)从一行中提取列的值(变量)
【发布时间】:2015-03-26 00:52:54
【问题描述】:

好的,所以我有一个变量($line),它在 bash/shell 脚本中定义为

$line = "abc:123:def:345" 

需要得到这个column2 = "123"

如何提取第二列的值,即“123”,并将其命名为不同的变量,以后可以求和?我知道您必须根据分隔符“:”将其分开,但我不知道如何在从 $line 变量中获取输入时转移到不同的变量。我之所以这么问,是因为出于某种奇怪的原因我的代码读取了文本文件的第一行但并没有仅在第一行执行 awk,因此总和是错误的。

FILE=$1
while read line
do
 awk -F: '{summation += $3;}END{print summation;}'
done < $FILE

-通过 shell 脚本编写代码

谢谢。

【问题讨论】:

  • 我不认为你的问题是完整的 - 我看不到你提到的第二列
  • 拜托,一小组样本数据涵盖了您想要解决的案例和 1 个不应该更改的案例(2 行数据,嗯?),+ 预期输出,+ 您尝试解决的问题您的问题,+ 任何错误消息的确切文本。使用编辑框顶部的{} 格式化工具来格式化您的代码和数据,使其不会被 S.O. 自动包装。系统。祝你好运。

标签: bash shell unix awk


【解决方案1】:

您可以使用awk 获取第二个字段:

line="abc:123:def:345"

awk -F: '{print $2}' <<< "$line"
123

【讨论】:

    【解决方案2】:

    要在 shell 中分配变量,左侧不要有 $= 周围不要有空格,并且 &lt;&gt; 是无效的引号字符

    line="abc:123:def:345"
    

    在 bash 中,你会这样做:

    IFS=: read -ra fields <<< "$line"
    
    • 暂时将IFS 设置为冒号
    • 使用$line 变量作为read 命令的输入(here-string
    • 并将值读入fields 数组。

    Bash 数组从零开始索引,因此要提取第二个字段:

    echo "${fields[1]}"   # => 123
    

    【讨论】:

      【解决方案3】:

      在 bash 中使用 expr 的方式

      Line2=$(expr $line : "[^:]*:\([^:]*\)")
      

      或者如果字段总是 3 个字符

      Line2=${line:4:3}
      

      【讨论】:

        【解决方案4】:

        使用普通的 POSIX 功能:

        #!/usr/bin/env sh
        
        line='abc:123:def:345'
        
        IFS=:
        # Split line on IFS into arguments
        set -- $line
        
        printf %s\\n "$2"
        

        替代方法:

        #!/usr/bin/env sh
        
        line='abc:123:def:345'
        
        # Strip out first column
        a="${line#*:}"
        
        # Strip out remaining columns except 1st
        b="${a%%:*}"
        
        printf %s\\n "$b"
        

        【讨论】:

          猜你喜欢
          • 2020-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-30
          相关资源
          最近更新 更多