我使用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脚本中做这样的事情?
答案 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