Aqui está um script Bash que faz o que você está procurando. O script é chamado de mergeAB.bash
.
#!/bin/bash
readarray A < fileA.txt
i=0
while read -r B; do
idx=$(( $i % ${#A[@]} ))
printf "%s %s" "$B" "${A[$idx]}"
#echo "i: $i | A#: ${#A[@]} | IDX: $idx"
let i=i+1
done < fileB.txt
Quando você o executa:
$ ./mergeAB.bash
01-Dec-2013 01.664 001 AAA CAC 1083 001 Apple, CA
01-Dec-2013 01.664 020 AAA CAC 0513 020 Banana, CN
01-Dec-2013 01.668 023 AAA CAC 1091 023 Apple, LA
01-Dec-2013 01.668 101 AAA CAC 0183 045 Orange, TT
01-Dec-2013 01.674 200 AAA CAC 0918 101 Orange, OS
01-Dec-2013 01.674 045 AAA CAC 0918 200 Kiwi, AA
01-Dec-2013 01.664 001 AAA CAC 2573 001 Apple, CA
01-Dec-2013 01.668 101 AAA CAC 1091 020 Banana, CN
01-Dec-2013 01.668 020 AAA CAC 6571 023 Apple, LA
01-Dec-2013 01.668 023 AAA CAC 2148 045 Orange, TT
01-Dec-2013 01.674 200 AAA CAC 0918 101 Orange, OS
01-Dec-2013 01.668 045 AAA CAC 5135 200 Kiwi, AA
Detalhes
A primeira coisa que fazemos é usar o comando readarray
para ler o conteúdo de fileA.txt
em uma matriz. Este é um recurso mais novo do Bash 4.x, então se você estiver usando uma versão mais antiga do Bash, você pode usar algo assim:
$ IFS=$'\n' read -d '' -r -a A < fileA.txt
O resto deste script é um pouco complexo, mas deixei um verboso echo
no meio que você pode descomentar para ver o que está acontecendo.
$ ./mergeAB.bash | grep i:
i: 0 | A#: 6 | IDX: 0
i: 1 | A#: 6 | IDX: 1
i: 2 | A#: 6 | IDX: 2
i: 3 | A#: 6 | IDX: 3
i: 4 | A#: 6 | IDX: 4
i: 5 | A#: 6 | IDX: 5
i: 6 | A#: 6 | IDX: 0
i: 7 | A#: 6 | IDX: 1
i: 8 | A#: 6 | IDX: 2
i: 9 | A#: 6 | IDX: 3
i: 10 | A#: 6 | IDX: 4
i: 11 | A#: 6 | IDX: 5
O que está acontecendo aqui? Há um contador, $i
, que usamos para contar cada linha de fileB.txt
à medida que passamos por ela. Em seguida, calculamos $idx
calculando a divisão do módulo do valor atual de $i
e o número de linhas em fileA.txt
.
NOTA: o comprimento da matriz A
. Calculando $idx
desta forma, podemos fazer um "loop" em torno de 0 a 5, depois 0 a 5 etc. Na saída de depuração acima, você pode ver isso com a coluna IDX:
.
O restante do script é bastante padronizado, usando printf
para imprimir as linhas concatenadas de fileB.txt
com a linha correspondente de fileA.txt
.