Como ler simultaneamente a partir de dois arquivos e imprimi-los linha a linha, bash? [duplicado]

0

Eu quero escrever um script que tenha como argumentos dois arquivos F1 e F2 e imprima-os alternativamente; primeiro será escrito 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 roteiro deve escrever o mais longo até o final.

Minha ideia foi:

1) Verifique se não há 2 argumentos - > eco e sair 2) Verifique se F1 ou F2 não são arquivos - > eco e sair 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 os dois arquivos tivessem o mesmo número de linhas. Como posso melhorar isso para estender essa solução para arquivos com tamanhos diferentes?

    
por enoy 05.11.2016 / 18:00

1 resposta

2

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 manipula contagens de linha diferentes da maneira que você está descrevendo. Para citar as especificações:

If an end-of-file condition is detected on one or more input files, but not all input files, paste shall behave as though empty lines were read from the files on which end-of-file was detected....

Pessoalmente, acho que seria um erro fazer o comportamento que você descreve na sua pergunta. Você seria incapaz de dizer, olhando para a linha 24 da saída, se veio de file1 ou file2 . Com o comportamento real de paste , você saberia que veio de file2 , já que é um número de linha igual da saída.

Você pode canalizar a saída por meio de tr -s '\n' da seguinte forma:

paste -d '\n' file1 file2 | tr -s '\n'

Mas, se houver linhas em branco reais em qualquer arquivo, você não obterá os resultados esperados.

    
por 05.11.2016 / 18:12

Tags