파일에서 줄을 읽고 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