
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
), (작업자 모델을 사용하여 가능한 한 빨리 줄을 처리) 또는 다음 조합을 사용하여 한 번에 몇 줄을 읽어 일종의 병렬성을 달성하려고 합니다. 이것들.$lineN
parallel
답변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
등