2012-02-01 2 views
3

에 꼬리를 구현 고양이 somefile | awk -f tail.awk 10 텍스트 파일의 마지막 10 행을 shoud로 인쇄하십시오. 제안 사항은 무엇입니까?

+1

awk -f tail.awk num = 10', 10 자체는 파일 이름으로 해석됩니다. 행운을 빕니다. – shellter

+0

정말로 전체 파일을 저장해야합니까? – Johnsyweb

+0

@Johnsyweb 잘 아니지만 그게 내가 생각한 접근법이야, 다른 아이디어가있어? 그 (것)들을 배치하게 자유롭게 떨어졌다 : –

답변

5
for(i=NR-num;i<=NR;i++) 
    print vect[$i] 

$은 위치 매개 변수를 나타냅니다. i 그냥 일반 사용

for(i=NR-num;i<=NR;i++) 
    print vect[i] 

나를 위해 일한 전체 코드는 다음과 같습니다

#!/usr/bin/awk -f 
BEGIN{ 
     num=ARGV[1]; 
     # Make that arg empty so awk doesn't interpret it as a file name. 
     ARGV[1] = ""; 
} 
{ 
     vect[NR]=$0; 
} 
END{ 
     for(i=NR-num;i<=NR;i++) 
       print vect[i] 
} 

당신은 아마 경우 NR < num을 처리 할 END에 일부 코드를 추가해야합니다.

+0

다른 대안이 있으면 궁금했다. 여전히 ARGV에서 오류가 발생한다. [1 ] ------------------------------------------------ ----------- cat test1.txt | awk -f tailawk 10 –

+0

내가 BEGIN {num = ARGV [1]}을 추가했다고 생각하십시오. –

2

num 값을 설정하려면 awk 명령 행에 -v num=10을 추가해야합니다. 그리고 마지막 루프에서 NR-num+1으로 시작하십시오. 그렇지 않으면 num+1 출력 라인이됩니다.

+0

예 thx nr-num을 역방향으로 읽으려고 시도 했으므로 nr-num을 증가시키는 것을 잊어 버렸습니다. 인덱스 및 증분, 잊어 버려 어쨌든 –

2

이 당신을 위해 작동 될 수 있습니다

awk '{a=a b $0;b=RS;if(NR<=v)next;a=substr(a,index(a,RS)+1)}END{print a}' v=10 
+1

설명했다면 나는 이것을 upvote 줄. 나는 그것을 이해할 수 있지만 모든 사람에게 설명이 필요하다. – Camusensei

3

이 답변은 모두가 전체 소스 파일을 저장합니다. 그것은 끔찍한 생각이며 더 큰 파일을 망가뜨릴 것입니다.

여기에 출력되는 라인의 수를 저장하는 빠른 방법이다 (참고 그는 전체 소스 파일을 읽을하지 않기 때문에 tail 항상 더 빠른 것 더 효율적으로!) :

awk -vt=10 '{o[NR%t]=$0}END{i=(NR<t?0:NR);do print o[++i%t];while(i%t!=NR%t)}' 

더 읽기 쉽게 (덜 code golf과) : 읽기 쉬운 코드의

awk -v tail=10 ' 
    { 
    output[NR % tail] = $0 
    } 
    END { 
    if(NR < tail) { 
     i = 0 
    } else { 
     i = NR 
    } 
    do { 
     i = (i + 1) % tail; 
     print output[i] 
    } while (i != NR % tail) 
    }' 

설명 :

이것은 modulo operator에 사용 원하는 수의 항목 만 저장하십시오 (tail 변수). 각 행이 파싱되면 이전 배열 값의 맨 위에 저장됩니다 (따라서 11 행은 output[1]에 저장됩니다).

END 스탠자는 증가 변수 i을 0 (원하는 줄 수보다 적 으면)으로 설정하거나 줄 수를 설정하여 저장된 줄을 다시 시작할 위치를 알려줍니다. 그런 다음 저장된 줄을 순서대로 인쇄합니다. 루프는 우리가 첫 번째 값으로 돌아 왔을 때 끝난다.

당신이 요청 된 수 (echo "foo" |awk -vt=10 …가있는 라인 전에 아홉 개 빈 줄을 것을 채우기 위해 빈 줄을 점점 걱정하지 않는 경우에 당신은 i = NRif/else 스탠자 (또는 내 golfed 예에서 ternary clause를) 대체 할 수있다 "foo").

관련 문제