awk 사용자 정의 함수를 사용하여 파일에서 가장 작은 정수를 인쇄하시겠습니까?

awk 사용자 정의 함수를 사용하여 파일에서 가장 작은 정수를 인쇄하시겠습니까?

awk함수는 파일 이름에서 다음과 같습니다 fun.awk.

{
print small()
}
function small()

{
a[NR]=$0

smal=0

for(i=1;i<=3;i++)
{
if( a[i]<a[i+1])

smal=a[i]

else

smal=a[i+1]

}
return smal
}

콘텐츠 awk.write:

1
23 
32

명령은 다음 awk과 같습니다:

awk -f fun.awk awk.write

아무런 결과도 나오지 않습니까? 왜?

고쳐 쓰다

{

print f()
}
function f()

{


if(NR==1){s=$0}


if($0<p)

{s=$0}

{p=$0}

 { return s}

}

답변1

두 버전의 코드 모두 small입력 파일의 각 줄에서 함수를 실행합니다. 전체 파일에서 가장 작은 숫자를 찾으려면 전체 파일을 처리한 후 마지막에 한 번만 함수를 실행하면 됩니다. 업데이트된 함수는 제대로 작동하고 올바른 출력을 세 번 인쇄하는 것처럼 보이지만 이는 가장 작은 숫자가 첫 번째 줄에 있기 때문입니다. 이 파일에서 실행하면:

$ cat awk.write
10
9
8

다음과 같은 결과가 출력됩니다.

awk -f fun.awk awk.write
10
9
8

이는 함수를 실행할 때마다 현재 줄 번호가 저장된 줄 번호보다 적어서 인쇄되기 때문입니다. 블록 을 사용 END{}하고 거기에서 함수를 실행해야 합니다.

function small(){
    for(i=1;i<=NR;i++)
    {
      ## If smal is not set or if it is greater than a[i]
      if(smal=="" || a[i]<=smal)
        smal=a[i]
    }
return smal
}
{
    ## NR is the current line number. This saves the current line
    ## in the array a.
    a[NR]=$0
}
## This will be executed only after everything has been read
END{
    print small()
}

NR또한 대신 사용하여 3여러 행에서 작동하도록 일반화했습니다. 다음과 같이 더욱 단순화할 수 있습니다.

{
    if(small=="" || $0<small){
    small=$0
    }
}
END{print small}

이는 다음 줄과 동일합니다.

awk '(small=="" || $0<small){small=$0}END{print small}' awk.write   

답변2

if 절에 구문 오류가 있습니다. 다음을 사용하십시오.

if( a[i]<a[i+1]){
  smal=a[i]
}else{
  smal=a[i+1]
}

그러나 각 행의 값을 인쇄합니다.


문제에 대한 더 나은 해결책은 다음과 같습니다.

sort -n file | head -1
  • 이렇게 하면 파일 내용이 숫자 오름차순으로 정렬되고 head첫 번째 줄만 인쇄됩니다.

또는 다음과 같아야 합니다 awk.

awk 'NR==1{s=$0} $0<p{s=$0} {p=$0} END{print s}' file
  • NR==1{s=$0}첫 번째 줄인 경우 s변수를 설정합니다.
  • $0<p{s=$0}현재 행이 이전 행보다 작은 경우 s변수는 해당 값으로 설정됩니다.
  • {p=$0}각 행에 대해 p다음 반복을 위한 (이전) 변수를 설정합니다.
  • END{print s}모든 행이 처리되면 값이 인쇄됩니다 s.

편집하다:이 모든 것을 하나의 함수로 표현하면 다음과 같습니다.

awk 'function f(){ if(NR==1){s=$0} if($0<p){s=$0}p=$0} {f()} END{print s}' file

관련 정보