2011-05-26 18 views
11

¿Hay alguna función similar de Python zip() en bash? Para ser más específicos, estoy buscando la funcionalidad equivilent en bash sin utilizar Python:Python zip() comportamiento en bash?

$ echo "A" > test_a 
$ echo "B" >> test_a 
$ echo "1" > test_b 
$ echo "2" >> test_b 
$ python -c "print '\n'.join([' '.join([a.strip(),b.strip()]) for a,b in zip(open('test_a'),open('test_b'))])" 
A 1 
B 2 
+0

Sólo por curiosidad: ¿Por qué evitando pitón en este caso? – dusktreader

+1

incrustándolo en una secuencia de comandos PBS. Me gustaría mantenerlo lo más simple posible pero no necesariamente opuesto a python – daniel

Respuesta

14

fiesta pura:

[email protected]:~$ zip34() { while read word3 <&3; do read word4 <&4 ; echo $word3 $word4 ; done } 
[email protected]:~$ zip34 3<a 4<b 
alpha one 
beta two 
gamma three 
delta four 
epsilon five 
[email protected]:~$ 

(respuesta de edad) Mira join.

liori:~% cat a 
alpha 
beta 
gamma 
delta 
epsilon 
liori:~% cat b 
one 
two 
three 
four 
five 
liori:~% join =(cat -n a) =(cat -n b) 
1 alpha one 
2 beta two 
3 gamma three 
4 delta four 
5 epsilon five 

(suponiendo que tenga el =() operator like in zsh, de lo contrario es más complicado).

+0

que es increíble. Miré join antes, pero tenía la impresión de que necesitabas identificadores comunes, como una unión SQL – daniel

+0

, la función en este caso agrega un poco más de flexibilidad. además de "comprimir" las líneas, también necesito agregar algo de texto entre ellas. ¡Gracias! – daniel

+0

¿Tiene un enlace sobre qué ''() 'hace? Es imposible buscar en Google esto :) – Marian

4

código

[tmp]$ echo "A" > test_a 
[tmp]$ echo "B" >> test_a 
[tmp]$ echo "1" > test_b 
[tmp]$ echo "2" >> test_b 
[tmp]$ cat test_a 
A 
B 
[tmp]$ cat test_b 
1 
2 
[tmp]$ paste test_a test_b > test_c 
[tmp]$ cat test_c 
A 1 
B 2 
0

Se podía hacerlo en dos pasos con cat -n seguido de join. (cat -n reproduce su archivo con los números de línea al comienzo de cada línea join se une a los dos archivos en los números de línea..)

$ echo "A" > test_a 
$ echo "B" >> test_a 
$ echo "X" > test_b 
$ echo "Y" >> test_b 
$ cat -n test_a > test_a.numbered 
$ cat -n test_b > test_b.numbered 
$ join -o 1.2 -o 2.2 test_a.numbered test_b.numbered 
A X 
B Y 
+0

ahhh ... así es como hacerlo con join :) – daniel