AWK-변수 및 함수 결과를 변수에 추가


1

변수와 함수 결과를 AWK에 추가하고 싶습니다. 입력:

t t t t
a t a ta
ata ta a a

스크립트:

{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0

산출:

4
2
2
0#<-the last print

답변:


2

Brandon Xavier가 지적했듯이 코드의 문제 는 일치 항목 gsub계산 하지 않는다는 것입니다 . 실제로 그것들을 대체합니다. 예를 들어

{
    print
    print gsub("t", "")
    print
    print gsub("t", "")
    print
    print "----------"
}

인쇄 할 것이다

t t t t
4

0

----------
a t a ta
2
a  a a
0
a  a a
----------
ata ta a a
2
aa a a a
0
aa a a a
----------

입력 데이터 손상에 신경 쓰지 않으면 (즉, ts를 계산하는 것이 유일한 일이라면) Brandon의 제안을 사용할 수 있습니다.

{
    x = gsub("t", "")
    print x
    b=b+x
}
END {print b}

위의 내용은 중복 gsub호출을 제거하는 한 가장 좋은 대답 입니다. (다음 방법은 여전히 ​​두 번의 호출을 사용합니다 gsub.)

새 변수를 추가하지 않으려면 대체를 비파괴 적으로 작성하면됩니다.

{
    key="t"
    print gsub(key, key)
    b=b+gsub(key, key)
}
END {print b}

즉, ts를 자신으로 교체 하므로 두 번째 작업을 수행 할 때 여전히 있습니다 gsub. ( 자신 gsub(key, "&")을 대신 key하여 사용할 수도 있습니다 .)

또 다른 방법은 첫 번째를 gsub 실제 입력 행 이외의 것으로 수정하는 것입니다.

{
    temp=$0
    print gsub("t", "", temp)
    b = b + gsub("t", "")
}
END {print b}

't'를 스스로 교체하십시오-너무 쉽습니다. 이 솔루션에 대해 생각하지 않은 이유를 설명 할 수 없으며 메모와 bash로 돌아 가야합니다. 고맙습니다.
diego9403

3

gsub는 발생 횟수 만 계산하는 것이 아니라 실제로이를 대체합니다. 거기에있는 첫 번째 인쇄 문 (아마도 디버깅 용)이 문을 깨고 있습니다.


따라서 일치하는 텍스트 만 계산하는 기능이 있습니까?
diego9403

1
내가 아는 것은 아닙니다. 나는 단지 '{key = "t"; x = gsub (키, ""); x 인쇄; b = b + x; }
Brandon Xavier

1
@BrandonXavier, 정답에 올바른 코드를 입력해야합니다.
glenn jackman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.