
Quero escrever um script que tenha como argumentos dois arquivos F1 e F2 e os imprima alternativamente; primeiro será escrita a primeira linha de F1, depois a segunda linha de F2'2 e assim por diante. Se um deles tiver menos linhas que o outro, quando terminarmos de imprimir o mais curto, o script deverá escrever o mais longo até o final.
Minha ideia foi:
1) Verifique se não há 2 argumentos -> echo e exit 2) Verifique se F1 ou F2 não são arquivos -> echo e exit 3) Corpo:
exec 3 < $1
exec 4 < $2
i=0
j=1
while read -u 3 line && ((i==0))
do
echo line; echo
((i++))
((j--))
while read -u 4 line && ((j==0))
do
echo line; echo
((j++))
((i--))
done
done
exit $?
Dúvida: Isso só funcionaria se ambos os arquivos tivessem o mesmo número de linhas. Como posso melhorar isso para estender esta solução a arquivos de tamanhos diferentes?
Responder1
Não há necessidade de um script de shell. Você pode fazer isso diretamente com paste
, que éespecificado por POSIX:
paste -d '\n' file1 file2
No entanto, ele não lida com contagens de linhas diferentes da maneira que você está descrevendo. Para citar as especificações:
Se uma condição de fim de arquivo for detectada em um ou mais arquivos de entrada, mas não em todos os arquivos de entrada,colardeve se comportar como se linhas vazias fossem lidas dos arquivos nos quais o fim do arquivo foi detectado....
Pessoalmente, acho que seria um erro adotar o comportamento descrito em sua pergunta. Você não conseguiria dizer, olhando para a linha 24 da saída, se ela veio de file1
ou file2
. Com o comportamento real de paste
, você saberia que veio de file2
, já que é um número de linha par da saída.
Você pode canalizar a saída tr -s '\n'
assim:
paste -d '\n' file1 file2 | tr -s '\n'
Mas, se houverreallinhas em branco em qualquer arquivo, você não obterá os resultados esperados.