bash awk将字符串拆分为数组

时间:2013-10-26 12:40:35

标签: bash

我使用awk使用特定的分隔符将字符串拆分为数组。现在,我想对数组的每个元素执行一些操作。

我能够像这样提取单个元素:

#! /bin/bash

b=12:34:56
a=`echo $b | awk '{split($0,numbers,":"); print numbers[1]}'`
echo $a

我想做这样的事情:

#! /bin/bash

b=12:34:56
`echo $b | awk '{split($0,numbers,":");}'`
for(i=0;i<length(numbers);i++)
{
   // perform some operation using numbers[i]
}

我如何在bash脚本中做这样的事情?

5 个答案:

答案 0 :(得分:17)

你真的不需要awk,bash可以自己完成一些字符串处理。

尝试:

b=12:34:56
for element in ${b//:/ } ; do
  echo $element
done

如果您需要一个计数器,那么添加它是非常简单的。

有关您可以直接在bash中执行的操作的详细信息,请参阅How do I do string manipulations in bash?

答案 1 :(得分:15)

这些答案都没有使用awk(怪异)。使用awk,您可以执行以下操作:

echo 12:34:56 | awk '{split($0,numbers,":")} END {for(n in numbers){ print numbers[n] }}'

print numbers[n]替换为您想要做的任何事情。

答案 2 :(得分:6)

b=12:34:56
IFS=:
set -- $b
for i; do echo $i; done

这不包含bashisms,但适用于每一个sh。

答案 3 :(得分:2)

bash read命令可以将字符串自行拆分为数组:

IFS=: read -a numbers <<< "$b"

要看到它有效:

echo "Hours: ${numbers[0]}"
echo "Minutes: ${numbers[1]}"
echo "Seconds: ${numbers[2]}"

for val in "${numbers[@]}"; do
   seconds=$(( seconds * 60 + $val ))
done

答案 4 :(得分:1)

另一种巧妙的方式,不是使用awk,而是内置'declare':

b=12:34:56

# USE IFS for splitting (and elements can have spaces in them)
IFS=":"
declare -a elements=( $b )
#show contents
for (( i=0 ; i < ${#elements[@]}; i++ )); do
    echo "$i= ${elements[$i]}"
done