我有一个 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
这可以“轻松地”扩展到一次读取二十行。
答案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)可用于为每个块创建一个文件:
split -l 20 input-file input-file-chunk-
创造input-file-chunk-aa
nput-file-chunk-ab
等