awk를 사용하여 줄 앞에 일련 번호를 내림차순으로 추가하는 방법

awk를 사용하여 줄 앞에 일련 번호를 내림차순으로 추가하는 방법

현재 저는 awk '{print NR,$0}' 이 명령을 사용하여 파일의 일련 번호를 인쇄하고 있습니다. 그런데 일련번호를 내림차순으로 인쇄하는 방법은 무엇입니까?

현재 출력:

1 abcd
2 abcd
3 abcd
4 abcd

원하는 출력:

4 abcd
3 abcd
2 abcd
1 abcd

답변1

awk대신에 자신만의(좀 더 장황한) 스크립트를 작성하는 것을 피할 수 있는 도구를 사용하십시오 .

비표준 tac유틸리티를 사용하여 파일의 줄을 역순으로 출력하고 cat비표준 -n옵션을 사용하여 줄 번호를 매깁니다.

tac file | cat -n | tac

답변2

참고: 이 답변에서는 텍스트 줄의 원래 순서를 유지하면서 줄 번호를 "카운트다운"하는 것이 목표라고 가정합니다. 이와 관련하여 게시물의 문구와 제공된 예제가 모호하므로 이 답변은 OP의 실제 문제를 해결하지 못할 수도 있습니다.

버퍼링을 방지하려면 대용량 파일의 경우 이중 전달 방식이 도움이 될 수 있습니다. 표준 구문을 사용하므로 이식성이 뛰어납니다.

awk 'NR==FNR{next} {printf "%d %s\n",(NR-2*FNR+1),$0}' input_file input_file

그러면 파일이 두 번 처리됩니다(따라서 인수로 두 번 제공됩니다).

  • 첫 번째 패스에서 파일별 라인 카운터는 FNR전역 라인 카운터와 동일하며 아무 작업도 수행하지 않고(= 실행을 위해 즉시 해당 라인으로 점프) 라인 카운터가 자동 증가하도록 합니다.NRnext
  • 두 번째 패스( FNR현재는 달라짐 NR)에서 역행 수를 NR(처리된 총 라인 수, 이는 입력 파일의 총 라인 수에 현재 라인 수를 더한 값) 빼기 2배 FNR(한 번)로 계산합니다. 파일 길이로 줄이고 실제로 카운트다운하려면 한 번) 1을 추가하고(그렇지 않으면 0마지막 줄의 줄 번호를 얻습니다) printf를 사용하여 줄 앞에 추가합니다.

답변3

사용awk

$ awk '{ a[i++]=NR" "$0 } END { for (n=i-1;n>=0;) print a[n--] }' input_file

답변4

다음 예제 입력을 사용하면:

one
two
three

입력 파일이 현재 가지고 있는 사용 가능한 메모리 양에 맞을 만큼 작고 줄의 순서도 유지하려는 경우에는 다음과 같습니다.

awk '{ data[NR]=$0 } 
END{ 
    for(recNr=NR; recNr>0; recNr--)
        print recNr, data[++c]
}' infile

산출:

3 one
2 two
1 three

또는 입력 라인의 순서를 바꾸려는 경우에도 마찬가지입니다.

awk '{ data[NR]=$0 } 
END{ 
    for(recNr=NR; recNr>0; recNr--)
        print recNr, data[recNr]
}' infile

산출:

3 three
2 two
1 one

관련 정보