2013-10-26 14 views
5

awkを使用して、文字列を特定の区切り文字を使って配列に分割しています。今、私は配列の各要素に対して何らかの操作を実行したいと思います。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のスクリプトでは、このような何かをしますか?

答えて

15

あなたは本当にawkを必要としません.bashは、文字列処理をすべて単独で行うことができます。

試してください:あなたはカウンターが必要な場合は

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

、それはそれを追加するために非常に簡単です。

bashで直接できることの詳細については、How do I do string manipulations in bash?を参照してください。

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

これはバッシュを含んでいませんが、すべてのshで動作します。

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

は、それが働いたことを確認するには:

+0

これは '$ @'の位置引数を上書きするので、 'set'コマンドを実行する前に必要に応じてそれらを保存する必要があることに注意してください。もちろん – chepner

+0

;通常は、複雑なタスクを独自の$ @コンテキストを持つ関数に入れています( "$ @"を保存するのはあまりにも醜いのでほとんど不可能です)。 – ensc

2

bashリードコマンドは、それ自体で配列に文字列を分割することができます

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

for val in "${numbers[@]}"; do 
    seconds=$((seconds * 60 + $val)) 
done 
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 
+0

これはすべての場合に機能しません。 'b'を引用符なしにしておくと、パス名の拡張と単語分割の対象になります。 – chepner

11

これらの回答はどれもawk(奇妙なもの)を使用していませんでした。

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

が、それはあなたがやりたいです何でprint numbers[n]を置き換える:AWKを使用すると、のような何かを行うことができます。

+1

彼らは 'awk'を使用しません。なぜなら、' bash'が何かをするために外部プログラムを起動する理由がないからです。 – chepner

+10

しかし、質問が「awkでこれを行う方法」であり、答えに「awk」が含まれていない場合、質問は本当に答えられません。その結果、Google検索は、awkでこれをどうやって行うのかを理解しようとしている人にとって役に立たない結果を返すことになります(これはawkで他のことをしているので役に立ちます。 –

+0

私は確かにawkでそれを行う方法を正確かつ具体的に探してこの質問に来ました。だからこの答えは私のための唯一の答えでした。 – Nick