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