Recorriendo pares de valores en bash [duplicado]

Resuelto Rish asked hace 9 años • 6 respuestas

Tengo 10 archivos de texto y quiero pastecada archivo con su par, de modo que tenga 5 archivos en total.

Intenté lo siguiente:

for i in 4_1 5_1 6_1 7_1 8_1
do
for j in 4_2 5_2 6_2 7_2 8_2
do
paste ${i}.txt ${j}.txt > ${i}.${j}.txt
done
done

Sin embargo, este código combina todas las combinaciones posibles en lugar de simplemente combinar los pares coincidentes.

Entonces me gustaría que el archivo 4_1.txtse empareje con 4_2.txt, 5_1.txtcon 5_2.txt, etc.

Rish avatar Feb 26 '15 00:02 Rish
Aceptado

Estoy de acuerdo con la respuesta propuesta actualmente por fedorqui en el contexto de la pregunta formulada actualmente. Lo siguiente se proporciona sólo para proporcionar algunas respuestas más generales.

Un enfoque más general (para bash 4.0 o posterior) es almacenar sus pares en una matriz asociativa:

declare -A pairs=( [4_1]=4_2 [5_1]=5_2 [6_1]=6_2 [7_1]=7_2 [8_1]=8_2 )
for i in "${!pairs[@]}"; do
  j=${pairs[$i]}
  paste "$i.txt" "$j.txt" >"${i}.${j}.txt"
done

Otra (compatible con versiones anteriores de bash) es utilizar más de una matriz convencional:

is=( 4_1 5_1 6_1 7_1 8_1 )
js=( 4_2 5_2 6_2 7_2 8_2 )
for idx in "${!is[@]}"; do
  i=${is[$idx]}
  j=${js[$idx]}
  paste "$i.txt" "$j.txt" >"$i.$j.txt"
done
Charles Duffy avatar Feb 25 '2015 17:02 Charles Duffy

Lo más simple hasta ahora:

for i in "1 a" "2 b" "3 c"; do a=( $i ); echo "${a[1]}"; echo "${a[0]}"; done

a
1
b
2
c
3
Fibo Kowalsky avatar Apr 22 '2020 14:04 Fibo Kowalsky