[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] loop que le varios arquivos
From: |
Fábio Olivé Leite |
Subject: |
Re: [shell-script] loop que le varios arquivos |
Date: |
Thu, 1 May 2003 19:37:47 -0300 |
User-agent: |
KMail/1.4.3 |
Olá!
Em Qui 01 Mai 2003 18:26, Germano Barreiro escreveu:
>
> Como eu implemento um loop que le mais de um arquivo
> ao mesmo tempo, ou seja, uma linha de cada arquivo a
> cada interacao do loop?
É só fazer um uso mais avançado dos redirecionamentos (o bash suporta
várias manipulações de descritores de arquivos). Por exemplo:
$ cat arq1
Linha 1 Arq 1
Linha 2 Arq 1
Linha 3 Arq 1
$ cat arq2
Linha 1 Arq 2
Linha 2 Arq 2
Linha 3 Arq 2
Linha 4 Arq 2
Linha 5 Arq 2
$ cat linhas.sh
#!/bin/bash
exec 10<arq1
exec 11<arq2
a1=eca
a2=eca
while [ -n "$a1" -o -n "$a2" ]; do
read a1 <&10
read a2 <&11
[ -n "$a1" ] && echo $a1
[ -n "$a2" ] && echo $a2
done
$ bash linhas.sh
Linha 1 Arq 1
Linha 1 Arq 2
Linha 2 Arq 1
Linha 2 Arq 2
Linha 3 Arq 1
Linha 3 Arq 2
Linha 4 Arq 2
Linha 5 Arq 2
O que o script faz é usar o exec para que o file descriptor (fd) 10 do
shell que está executando o script seja aberto para leitura do
arquivo arq1, e o fd 11 seja aberto para leitura do arquivo arq2. Aí
fazes um loop como quiser (eu neste exemplo fiz o loop continuar
enquanto houver algum valor em alguma das variáveis, por isso que as
inicializei com "eca") e quando quiseres ler uma linha do arquivo
arq1, basta fazer um read VAR <&10, e <&11 para o arq2.
O <&n significa "redirecione a entrada do comando a partir do file
descriptor n". Qualquer processo em Unix já sai com três fds
ocupados, 0, 1 e 2. 0 é a entrada padrão, 1 a saída padrão e 2 a
saída de erro padrão.
Por isso que frequentemente se usa 2>/dev/null quando não se quer ver
as mensagens de erro de um programa.
Espero que tenha ficado compreensível! :)
--
OpenBSD: Unix casca grossa -=- KNOW THYSHELL (that is, man ksh)