![파일의 줄 수를 반복하는 방법](https://linux55.com/image/218202/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%A4%84%20%EC%88%98%EB%A5%BC%20%EB%B0%98%EB%B3%B5%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
텍스트 파일의 행을 반복하고 싶습니다 a.txt
. 파일에 6줄이 있으면 다음과 같이 할 수 있습니다.
for c in {1..6} ; do echo $c; done
인쇄:
1
2
3
4
5
6
행 수를 다음과 같이 계산할 수 있습니다.
wc -l a.txt | cut -f1 -d' '
이것은 만든다2852
wc
이제 아래와 같이 개수를 for 루프로 바꾸려고 하면 루프가 작동하지 않습니다.
for c in {1..$(wc -l ~/a.txt| cut -f1 -d' ')} ; do echo $c; done
1에서 2852 사이의 숫자를 인쇄하는 대신 다음을 인쇄합니다.
{1..2852}
올바른 숫자 순서를 얻으려면 위 루프에서 서브셸 사용법을 어떻게 수정해야 합니까?
(
bash --version
예(데비안):
GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
)
답변1
배쉬는 그렇지 않았다케시변수를 괄호 안에 넣는 함수입니다.
var=$(wc -l ~/a.txt| cut -f1 -d' ')}
echo {0..$var}
루프를 사용할 수 있습니다.
for ((i=0; i<var; i++)); do
echo "$i"
done
작동하더라도 다음은 피해야 합니다.
eval echo {0..$var}
eval
"악"의 일반적인 철자 오류입니다.
바라보다http://mywiki.wooledge.org/BashFAQ/048
답변2
실제로 파일을 처리하기 위해 파일의 줄 수를 알 필요는 없습니다. 쉘 루프를 사용하지 않고도 파일을 처리하기만 하면 됩니다 awk
.
awk '{ print "do something on line#", NR, $0 }' infile
존재하다앗, 내부 변수 NR
가 반환됩니다.질소수량오른쪽ecord(/Line)은 $0
처리를 위해 현재 읽은 줄의 내용입니다.