라인을 읽고 라인과 라인 번호를 출력하는 쉘 프로그램

라인을 읽고 라인과 라인 번호를 출력하는 쉘 프로그램

파일에서 줄을 읽고 stdin줄 번호를 사용하여 줄을 쓰는 프로그램을 작성해야 합니다. stdout나는 그것을 사용할 수 없습니다 cat -n.

텍스트 파일에 다음과 같은 내용이 있다고 가정합니다.

 abcdef
 ghi

 klm
 nopqr st

기본적으로 라인을 읽고 라인을 출력해야 하지만 라인 번호도 포함됩니다.

이것은 내 동안 읽기 루프이지만 모든 줄을 인쇄하지는 않습니다.

while read line
do
    awk '{print NR, $0}'

done < file

기본적으로 출력은 다음과 같습니다.

1 ghi
2 
3 klm
4 nopqr   st

어떤 이유로든 abcdef아무것도 표시되지 않으며 숫자 2는 비워둘 수 없습니다.

답변1

시도해 봤어?nl -b a <file_name>

debian@virt00:~/test$ nl -b a file
     1  abcdef
     2   ghi
     3
     4   klm
     5   nopqr st
debian@virt00:~/test$
  • nl은 수직선을 나타냅니다.
  • -b 텍스트 번호 플래그
  • 'a'는 모든 행을 나타냅니다.

더 많은 정보를 알고 싶다면http://linux.die.net/man/1/nl

답변2

"cat -n"을 사용할 수 있습니다. "-n" 플래그는 "cat"의 출력 행에 숫자를 추가하는 것입니다.

답변3

awk '$0!=""{print NR, $0}' file

비우는 것을 말합니다 $0 != "". $0 not equal이 줄의 경우 줄 번호와 줄 번호를 인쇄하세요.


그러면 다음과 같은 출력이 생성됩니다.

1 abcdef
2 ghi
4 klm
5 nopqr st

이전 줄 번호로. 새 줄 번호가 포함된 출력이 필요한 경우:

awk '$0!=""{a++; print a, $0}' file

1 abcdef
2 ghi
3 klm
4 nopqr st

스크립트 작동 방식을 설명하세요.

첫 번째 줄을 읽 습니다 read line(인쇄하지 않음).
그런 다음 파일을 awk다른 모든 줄에 연결하고 처리합니다.
awk는 (기본적으로) 빈 줄을 제거하지 않으므로 빈 줄도 인쇄됩니다.

이 문제를 해결하는 방법은 여러 가지가 있는데, 위의 방법이 가장 간단한 것 같습니다.

답변4

#!/bin/bash

awk '!/^$/{print ++a, $0}' file

echo

awk '!!$0{print ++a, $0}' file

echo

awk '{if ($0 != "") print ++aa, $0}' file

echo

NR=0
while read -r
do
    [[ "${REPLY}" = "" ]] || echo $((++NR)) "${REPLY}"
done < file

echo

관련 정보