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

관련 정보