Bash를 사용하여 파일의 처음 5줄을 반복하는 방법은 무엇입니까?

Bash를 사용하여 파일의 처음 5줄을 반복하는 방법은 무엇입니까?

다음과 같이 파일의 행을 반복할 수 있습니다.

while read l; do echo $l; done < file

처음 5개 행만 반복하는 방법이 있나요?

답변1

다음을 수행하세요.

n=5
while IFS= read -ru3 line && (( n-- )); do
  printf 'Got this line: "%s"\n' "$line"
done 3< some-file

그러나 텍스트 처리가 관련된 경우 텍스트 처리 도구를 사용하는 것이 더 좋습니다.

LC_ALL=C sed 's/.*/Got this line: "&"/;5q' < some-file

또는:

awk '{print "Got this line: \""$0"\""}; NR == 5 {exit}' < some-file

또는:

perl -lne 'print qq(Got this line: "$_"); last if $. == 5' < some-file

관련된:

답변2

파일의 처음 5줄을 반복하는 방법에는 여러 가지가 있습니다. 다음은 몇 가지입니다. 일반적으로 마지막 것이 가장 효율적이라는 점에 유의하세요.더 좋은 방법이러한 유형의 문제에 대한 해결책은 쉘 스크립트 루프를 사용하는 것입니다.

무차별 대입:

{
    OIFS="$IFS" IFS=
    read -r line && printf "%s\n" "$line"
    read -r line && printf "%s\n" "$line"
    read -r line && printf "%s\n" "$line"
    read -r line && printf "%s\n" "$line"
    read -r line && printf "%s\n" "$line"
    IFS="$OIFS" 
} <file

루프:

for ((i=1; i<=5; i++))
do
    IFS= read -r line
    printf "%s\n" "$line"
done <file

또 다른 루프는 표현식이 평가되기 전에 모든 값의 목록으로 확장되므로 작은 범위에 적합합니다(즉, 다음 {1..5}으로 변환됨).1 2 3 4 5 앞으로구현하다):

for i in {1..5}
do
    IFS= read -r line
    printf "%s\n" "$line"
done <file

파일의 시작 부분만 고려되지만 이 루프 내에 설정된 모든 변수에 유의하세요.접근이 불가능할 것이다그것 밖에

head -n5 file |
    while IFS= read -r line
    do
        printf "%s\n" "$line"
    done

루프를 전혀 사용하지 마십시오

head -n5 file

sed 5q file

답변3

당신은 그것을 사용할 수 있습니다프로세스 교체, 파이프를 사용하는 것과 달리 프로세스 대체를 통해 while head -n 5 file루프 는 현재 셸에서 실행되고 해당 셸에서 변수를 설정/변경할 수 있으며 그렇지 않으면 해당 환경에 영향을 미칠 수 있습니다. - 하위 프로세스 또는 하위 셸 (파이프 등)은 상위 환경에 영향을 미칠 수 없습니다.filehead -n 5 file

예를 들어:

while read l; do printf '%s\n' "$l"; done < <(head -n 5 file)

printf대신에 셸을 사용하는 이유 echo와 텍스트를 처리하기 위해 셸을 사용하지 않는다는 경고에 대해 설명하겠습니다 .스티븐의 대답이것은 이미 완료되었습니다. 이 답변의 링크를 읽어 보시기 바랍니다.

관련 정보