ファイルから一連の行を読み取る

ファイルから一連の行を読み取る

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行のブロックに分割し、各ブロックでランダムに1行を選択します(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など

関連情報