Lendo conjunto de linhas de um arquivo

1

Eu tenho um arquivo de 1000 linhas. Eu preciso ler esse arquivo 10/20 linhas por vez e executá-las ou salvá-lo em outro arquivo. Da próxima vez, leia o arquivo de 21/11 e faça o mesmo. Isso deve ser feito até o fim do curso.

Como devo restringir o número durante a leitura do arquivo?

    
por Aishu Lucky 03.07.2017 / 13:21

4 respostas

0

Simplisticamente:

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

Isso poderia "facilmente" ser estendido para ler vinte linhas por vez.

    
por 03.07.2017 / 18:23
0

Isso faria isso:

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

No entanto, é muito estranho ter a restrição de ler exatamente N linhas, a menos que sua estrutura de dados seja um número fixo de linhas. Normalmente, o que é tentado lendo várias linhas por vez é algum tipo de paralelismo, que seria melhor obtido usando xargs (para manipular várias variáveis $lineN em um único comando), parallel (para usar um trabalhador modelo para lidar com linhas ASAP), ou uma combinação destes.

    
por 03.07.2017 / 13:28
0

Você pode fazer o seguinte para ler 5 linhas:

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
    
por 03.07.2017 / 19:17
0

Podemos split e filtrar o arquivo ...

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

Exemplo: divida em blocos de 20 linhas e escolha uma linha aleatória de cada parte ( shuf -n 1 )

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

O comando sama (split) pode ser usado para criar um arquivo para cada pedaço:

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

criando input-file-chunk-aa nput-file-chunk-ab etc

    
por 03.07.2017 / 19:36