Concatena pares de arquivos em um loop

1

Eu tenho duas listas de arquivos que terminam com duas extensões diferentes e gostaria de concatená-las em pares, em um loop. Os nomes dos arquivos se parecem com estes:

Estes são os arquivos

a.ID, b.ID, c.ID, d.ID     
a.value, b.value, c.value, d.value  

intuitivamente eu faria:

for i in *.ID;  
do  
     for j in *.value;  
do  
     cat $i $j > $i.txt ; done  
done  

O problema é que gostaria de mesclar a.ID com a.value e b.ID com b.value e, desse modo, eles são mesclados aleatoriamente. Como a.value com b.ID etc ..

Alguma ideia? Agradecemos antecipadamente

Exemplo de entrada a.ID (por exemplo):

chr1_237301_237601  176 1  
chr1_237601_237901  176 1  
chr1_237901_238201  176 1 

Amostras terminadas com a.value (por exemplo):

chr1_1_301      0   0  
chr1_301_601    0   0  
chr1_601_901    0   0  
chr1_901_1201   0   0  
chr1_1201_1501  0   0  

saída:

chr1_237301_237601  176 1    
chr1_237601_237901  176 1   
chr1_237901_238201  176 1  
chr1_1_301      0   0    
chr1_301_601    0   0   
chr1_601_901    0   0  
chr1_901_1201   0   0  
chr1_1201_1501  0   0
    
por fusion.slope 25.01.2017 / 18:28

2 respostas

6

Você não precisa de dois loops. Você precisa de um único loop, através de a , b , c etc. Assim:

for i in *.ID; do
    b=${i%%.ID}
    cat "$i" "$b".value >"$b".txt
done
    
por 25.01.2017 / 18:35
0

Só porque é possível fazer isso, aqui está a abordagem find + bash .

$ ls
a.ID  a.value

$ find -type f -iname "*.ID" -exec bash -c 'base=$(basename -s ".ID" "$@");cat "$@" "$base".value > "$base".merged' sh   "{}" \;

$ ls
a.ID  a.merged  a.value

$ cat a.merged                                                                                                           
chr1_237301_237601  176 1  
chr1_237601_237901  176 1  
chr1_237901_238201  176 1 
chr1_1_301      0   0  
chr1_301_601    0   0  
chr1_601_901    0   0 
    
por 25.01.2017 / 18:55