파일에서 일련의 행 읽기

파일에서 일련의 행 읽기

1000줄의 파일이 있습니다. 파일을 한 번에 10/20줄씩 읽어서 실행하거나 다른 파일에 저장해야 합니다. 다음번에는 11월 21일의 파일을 읽고 동일한 작업을 수행해야 합니다. EOF까지 실행되어야 합니다.

파일을 읽을 때 개수를 제한하는 방법은 무엇입니까?

답변1

일반적인 말하기:

while read -r one
do 
  read -r two && 
  read -r three && 
  read -r four && 
  read -r five && 
  read -r six && 
  read -r seven && 
  read -r eight && 
  read -r nine && 
  read -r ten && 
  printf "%s\n" "$one" "$two" "$three" "$four" "$five" "$six" "$seven" "$eight" "$nine" "$ten"
  ## or whatever you want to do to process those lines
  echo END OF SECTION 
done < input-file

이는 한 번에 20줄을 읽는 것으로 "쉽게" 확장됩니다.

답변2

이렇게 하면 다음과 같이 됩니다:

while read line1 && [do something with $line1]
do
    read line2 && [do something with $line2]
    read line3 && [do something with $line3]
    […]
done < file.txt

그러나 데이터 구조에 행 수가 고정되어 있지 않으면 읽기를 N 행으로 제한하는 것은 이상합니다. 일반적으로 (단일 명령으로 여러 변수를 처리 xargs), (작업자 모델을 사용하여 가능한 한 빨리 줄을 처리) 또는 다음 조합을 사용하여 한 번에 몇 줄을 읽어 일종의 병렬성을 달성하려고 합니다. 이것들.$lineNparallel

답변3

다음을 수행하여 5줄을 읽을 수 있습니다.

N=5; # Number of lines to process together (YMMV)
cat input_file |
while IFS= read -r v1; do
   eof=
   for i in $(seq 2 "$N"); do
      IFS= read -r "v$i" || { unset -v eof; break; }
   done
   ${eof+:} break
   echo "The 5 lines read in are: $v1 $v2 $v3 $v4 $v5"
done

답변4

파일을 필터링 할 수 있습니다 split...

split -l 20 --filter='command'  input_file

예: 20개 행의 블록으로 나누고 각 블록에서 무작위로 한 행을 선택합니다( shuf -n 1).

split -l 20 --filter='shuf -n 1' input_file

sama 명령(분할)을 사용하여 각 블록에 대한 파일을 생성할 수 있습니다.

split -l 20 input-file input-file-chunk-

창작 input-file-chunk-aa nput-file-chunk-ab

관련 정보