Crie combinações de elementos de um vetor para fornecer como entrada em um programa

2

Eu tenho uma lista de palavras. Por exemplo:

a=(ENCFF002CDP ENCFF002COQ ENCFF002DAJ ENCFF002DCM)  

e quero executar todas as combinações possíveis deles e com uma ferramenta, como:

bedtools intersect -a ENCFF002CDP -b ENCFF002COQ > ENCFF002CDP.ENCFF002COQ.intersected  
bedtools intersect -a ENCFF002CDP -b ENCFF002DAJ > ENCFF002CDP.ENCFF002DAJ.intersected  

para todas as combinações possíveis.

Como posso fazer isso?

    
por fusion.slope 19.01.2017 / 15:26

3 respostas

5
declare -a encode_ids=(ENCFF002CDP ENCFF002COQ ENCFF002DAJ ENCFF002DCM)  

for (( i = 0; i < ${#encode_ids[@]}; ++i )); do
  for (( j = i + 1; j < ${#encode_ids[@]}; ++j )); do
    bedtools intersect -a "${encode_ids[i]}" -b "${encode_ids[j]}" \
      >"${encode_ids[i]}.${encode_ids[j]}".intersected
  done
done

O loop duplo acima fornecerá todas as combinações dos IDs fornecidos, mas deixará de fora combinações do mesmo ID com ele mesmo, além de evitar a combinação do ID A com B se a combinação B with A já foi usado.

A matriz de exemplo resultará no seguinte bedtool runs:

bedtools intersect -a ENCFF002CDP -b ENCFF002COQ >ENCFF002CDP.ENCFF002COQ.intersected
bedtools intersect -a ENCFF002CDP -b ENCFF002DAJ >ENCFF002CDP.ENCFF002DAJ.intersected
bedtools intersect -a ENCFF002CDP -b ENCFF002DCM >ENCFF002CDP.ENCFF002DCM.intersected
bedtools intersect -a ENCFF002COQ -b ENCFF002DAJ >ENCFF002COQ.ENCFF002DAJ.intersected
bedtools intersect -a ENCFF002COQ -b ENCFF002DCM >ENCFF002COQ.ENCFF002DCM.intersected
bedtools intersect -a ENCFF002DAJ -b ENCFF002DCM >ENCFF002DAJ.ENCFF002DCM.intersected
    
por 19.01.2017 / 16:04
1

E sobre isso?

combo.py

import sys
from itertools import combinations
for i in combinations(sys.stdin.readline().strip().split(" "),2):
    print i[0],i[1]

k.sh

#!/usr/bin/env bash

a=(ENCFF002CDP ENCFF002COQ ENCFF002DAJ ENCFF002DCM)

echo "${a[@]}" | python combo.py  | while IFS=" " read -r a b
do
    echo "bedtools intersect -a $a -b $b > $a.$b.intersected"
done

./ k.sh deve gerar

bedtools intersect -a ENCFF002CDP -b ENCFF002COQ > ENCFF002CDP.ENCFF002COQ.intersected
bedtools intersect -a ENCFF002CDP -b ENCFF002DAJ > ENCFF002CDP.ENCFF002DAJ.intersected
bedtools intersect -a ENCFF002CDP -b ENCFF002DCM > ENCFF002CDP.ENCFF002DCM.intersected
bedtools intersect -a ENCFF002COQ -b ENCFF002DAJ > ENCFF002COQ.ENCFF002DAJ.intersected
bedtools intersect -a ENCFF002COQ -b ENCFF002DCM > ENCFF002COQ.ENCFF002DCM.intersected
bedtools intersect -a ENCFF002DAJ -b ENCFF002DCM > ENCFF002DAJ.ENCFF002DCM.intersected
    
por 19.01.2017 / 16:07
1

Esta é uma versão do awk.
Se você precisar executar o comando bedtools no sistema, remova "echo" e "\\".

$ awk '{ 
        gsub(/[^0-9A-Z ]/,"")    # delete unneeded chars like "a=(", ")"
        for ( i=1; i < NF; i++) { 
            for (j=(i+1); j <= NF; j++) { 
                system("echo bedtools intersect -a "$i" -b "$j" \> "$i"."$j".intersected")
            } 
        }  
}' file

bedtools intersect -a ENCFF002CDP -b ENCFF002COQ > ENCFF002CDP.ENCFF002COQ.intersected
bedtools intersect -a ENCFF002CDP -b ENCFF002DAJ > ENCFF002CDP.ENCFF002DAJ.intersected
bedtools intersect -a ENCFF002CDP -b ENCFF002DCM > ENCFF002CDP.ENCFF002DCM.intersected
bedtools intersect -a ENCFF002COQ -b ENCFF002DAJ > ENCFF002COQ.ENCFF002DAJ.intersected
bedtools intersect -a ENCFF002COQ -b ENCFF002DCM > ENCFF002COQ.ENCFF002DCM.intersected
bedtools intersect -a ENCFF002DAJ -b ENCFF002DCM > ENCFF002DAJ.ENCFF002DCM.intersected
    
por 27.01.2017 / 23:32