awkの同じ行から複数​​の一致するインデックス値を取得するには?

awkの同じ行から複数​​の一致するインデックス値を取得するには?

私は次の表現を知っています。

echo "bob alice robert alice" | awk '{print index($0,"alice")}'
5

最初のアリスと一致するインデックスが出力されます。一致するすべてのインデックスを取得する方法はありますか? 、例えば:

echo "bob alice robert alice" | awk 'unknown magic'
5:18

答え1

POSIXツールボックスの使用:

echo "bob alice robert alice"| p=alice awk '
{
  while(1) {
    $0 = substr($0, RSTART+RLENGTH)
    match($0, ENVIRON["p"])
    if (RSTART == 0) break
    i = i ? i+RSTART+RLENGTH-1 : RSTART
    print i
  }
}' | paste -sd: -
5:18

答え2

これはあなたの仕事をしなければなりません:

echo "bob alice robert alice" |\
awk '{
    s=$0
    o=0
    m="alice"
    l=length(m)
    i=index(s,m)
    while (i>0) {
        o+=i
        print o
        s=substr(s,i+l)
        o+=l-1
        i=index(s,m)
    }
}'

「:」(コロン)を使用してフォーマットするにはパイプできます。

paste -s |tr '\t' ':'

答え3

echo "bob alice robert alice"| awk '
{for( i=1;i<=NF;i++) {
    if ( $i == "alice") {
          printf index($0,"alice") ":"
          gsub("alice","xxxxx",$i)
     }
}
print " "
}'

関連情報