6

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

4

5 回答 5

19

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

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

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

于 2015-11-20T15:01:41.313 回答
16

您实际上并不需要 awk,bash 可以自己进行一些字符串处理。

尝试:

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

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

请参阅如何在 bash 中进行字符串操作?有关您可以直接在 bash 中执行的操作的更多信息。

于 2013-10-26T12:50:02.793 回答
6
b=12:34:56
IFS=:
set -- $b
for i; do echo $i; done

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

于 2013-10-26T13:02:21.817 回答
2

read 命令可以自己将bash一个字符串拆分成一个数组:

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
于 2013-10-26T13:46:04.447 回答
1

另一种巧妙的方法,不使用 awk,而是内置“声明”:

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
于 2013-12-01T10:21:36.657 回答