Lendo dois arquivos em um IFS while loop - Existe uma maneira de obter um resultado zero diff neste caso?

3

Eu tenho um arquivo de texto cheio de várias centenas de linhas de seqüências como esta:


    b 29.
    b 52.
    c 84.
    c 83.
    c 94.
    c 93.
    c 61.
    b 38.
    c 81.
    c 92.
    c 28.
    c 37.
    c 27.

    lara@batcuter:~/.asd/a-new-way-of-studying-go$ wc -l game7
    271 game7

e o seguinte script, que separa um arquivo de texto em dois arquivos, um dos quais consiste em linhas ímpares e um deles consiste em linhas pares, depois lê os dois arquivos em um loop IFS, imprimindo uma linha de cada vez:

#/bin/bash
#testing liquor-where-twin-twas-born

awk '{print>"line-"NR%2}' $@

while IFS= read -r lineA && IFS= read -r lineB <&3; do
  echo "$lineA";
  echo "$lineB" 
done <line-1 3<line-0

que infelizmente dá algo diferente do arquivo de entrada, devido ao fato de que um arquivo era uma linha mais longa que o outro.


    lara@batcuter:~/.asd/a-new-way-of-studying-go$ testing-liquor game7 > test
    lara@batcuter:~/.asd/a-new-way-of-studying-go$ diff test game7
    270a271
    > b 7.

Obviamente, como o arquivo tem 271 linhas, a divisão ao meio produz dois arquivos, um dos quais é de 136 linhas e um dos quais é de 135 linhas. Eu preciso corrigir o IFS while loop para retornar diferenças zero. No começo, achei que usar read ... || read ... ajudaria. Mas na verdade, isso apenas inchava a saída, inserindo mais de uma linha entre cada entrada, e removendo a última linha (a linha que acabou no arquivo com o número ímpar de linhas), assim como todas as outras soluções. tentou.

    
por ixtmixilix 14.12.2011 / 00:02

1 resposta

4

Diga a pessoa que sugeriu || que ele é um idiota. Usar || faz o snippet ler todas as linhas de fileA primeiro e, em seguida, todas as linhas de fileB , porque, contanto que read lineA retorne verdadeiro, read lineB não será executado. Em vez disso, chame read ambas as vezes, salvando o status de retorno e, em seguida, teste os status de retorno.

while
    IFS= read -r lineA; statusA=$?
    IFS= read -r lineB; statusB=$?
    [ $statusA -eq 0 ] || [ $statusB -eq 0 ]
do …

Você pode testar $statusA e $statusB dentro do loop se precisar saber se um arquivo está esgotado (o conteúdo da linha estará vazio, mas isso não é distinguível de uma linha vazia). / p>     

por 14.12.2011 / 13:06