Como obter valores de índice para várias correspondências na mesma linha no awk?

0

Eu conheço a seguinte expressão:

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

Produzirá o índice da primeira correspondência de alice, existe alguma maneira de obter o índice de todas as correspondências ?, por exemplo:

echo "bob alice robert alice" | awk 'unknown magic'
5:18
    
por Javier López 14.07.2015 / 07:09

3 respostas

1

Com o POSIX tools chest:

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
    
por 14.07.2015 / 09:59
1

Isso deve fazer o seu trabalho:

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)
    }
}'

Para formatar com o ':' (dois pontos), você pode canalizar através de

paste -s |tr '\t' ':'
    
por 14.07.2015 / 08:51
1
echo "bob alice robert alice"| awk '
{for( i=1;i<=NF;i++) {
    if ( $i == "alice") {
          printf index($0,"alice") ":"
          gsub("alice","xxxxx",$i)
     }
}
print " "
}'
    
por 14.07.2015 / 09:05

Tags