Eu quero comparar e combinar dois arquivos e imprimi-los em um arquivo

0

Eu tenho dois arquivos, arquivo1 e arquivo2

arquivo1:

  r11_abc_gkhsa 1.0 1.5 1.9

  r11_bcd_gkhsa 1.0 1.5 1.7

  r11_acd_gkhsa 1.3 1.6 1.5

  r11_xyz_gkhsa 1.0 1.5 1.9

arquivo2:

  sd1_bcd_gkhsa 1.8 1.5 1.9

  ab1_abc_gkhsa 1.6 1.4 1.5

  sfs_xyz_gkhsa 1.4 1.6 1.4

  sd1_acd_gkhsa 1.2 1.3 1.5

  sfs_ryb_gkhsa 1.5 1.2 1.7

Eu quero corresponder "abc, bcd, acd e xyz" do arquivo1 ao arquivo2. Sempre que combinou com o arquivo2, quero imprimi-lo da seguinte maneira.

Saída:

 r11_abc_gkhsa 1.0 1.5 1.9     ab1_abc_gkhsa 1.6 1.4 1.5

 r11_bcd_gkhsa 1.0 1.5 1.7     sd1_bcd_gkhsa 1.8 1.5 1.9

 r11_acd_gkhsa 1.3 1.6 1.5     sd1_acd_gkhsa 1.2 1.3 1.5

 r11_xyz_gkhsa 1.0 1.5 1.9     sfs_xyz_gkhsa 1.4 1.6 1.4


  sfs_ryb_gkhsa 1.5 1.2 1.7

pode usar Perl ou sed. alguém pode me dar idéias para trabalhar nisso?

    
por SKG 21.10.2016 / 04:12

2 respostas

0

Se você quiser apenas usar matrizes simples bash -

#read in the data from 2 files
unset arr1; declare -A arr1; 
while read -r -u3 line; do \
    i=${line%_*}; \
    i=${i#*_}; \
    arr1[$i]+=" $line"; \
done 3< <(cat f1 f2); \
exec 3<&-
#output array by iterating throug the keys
for k in "${!arr1[@]}"; do \
     echo ${arr1[$k]}; \
done | sort

Saída -

r11_abc_gkhsa 1.0 1.5 1.9 ab1_abc_gkhsa 1.6 1.4 1.5
r11_acd_gkhsa 1.3 1.6 1.5 sd1_acd_gkhsa 1.2 1.3 1.5
r11_bcd_gkhsa 1.0 1.5 1.7 sd1_bcd_gkhsa 1.8 1.5 1.9
r11_xyz_gkhsa 1.0 1.5 1.9 sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7
    
por 21.10.2016 / 09:06
0

Usando join , sort e sed :

join -j 2 -t_ -a 1 -a 2  -o 1.1,1.2,1.3,1.9999,2.1,2.2,2.3 \
     <(sort -t_ -k2 file1) <(sort -t_ -k2 file2) | \
     sed 's/__/  /g;s/^ *//g' | sort
  1. sort arquivo1 & arquivo2 usando a substituição do processo bash *, então ...
  2. Usando _ como um separador de campo, join os dois arquivos classificados em instâncias comuns do campo # 2 e também imprime apenas uma linha de qualquer arquivo que não corresponda. O campo inexistente 1.9999 separa cada par unido com um _ extra para simplificar a etapa nº 3.
  3. Limpe pedaços feios de saída com sed .
  4. sort os resultados.

Saída:

r11_abc_gkhsa 1.0 1.5 1.9  ab1_abc_gkhsa 1.6 1.4 1.5
r11_acd_gkhsa 1.3 1.6 1.5  sd1_acd_gkhsa 1.2 1.3 1.5
r11_bcd_gkhsa 1.0 1.5 1.7  sd1_bcd_gkhsa 1.8 1.5 1.9
r11_xyz_gkhsa 1.0 1.5 1.9  sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7
    
por 21.10.2016 / 07:03

Tags