从一行(变量)中提取列的值

时间:2015-03-26 00:52:55

标签: bash shell unix awk

好的,所以我有一个在bash / shell脚本中定义为

的变量($ line)
$line = "abc:123:def:345" 

需要得到这个列2 =" 123"

如何提取第二列的值,即" 123"并将其命名为一个不同的变量,以后可以加总?我知道你必须根据分隔符分开它:':'但我不知道在从$ line变量输入的同时如何转换到不同的变量。我只问这个因为一些奇怪的原因我的代码读取文本文件的第一行但不仅仅在第一行执行awk 因此总和是错误的。

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

-code via shell script

感谢。

4 个答案:

答案 0 :(得分:6)

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

line="abc:123:def:345"

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

答案 1 :(得分:3)

要在shell中指定变量,左侧没有$=周围没有空格,<>无效报价字符

line="abc:123:def:345"

在bash中,你会这样做:

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

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

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

答案 2 :(得分:0)

使用expr

在bash中的方式
Line2=$(expr $line : "[^:]*:\([^:]*\)")

或如果字段总是3个字符

Line2=${line:4:3}

答案 3 :(得分:0)

使用普通的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"