프로그램에 대한 입력으로 벡터의 요소 조합을 만듭니다.

프로그램에 대한 입력으로 벡터의 요소 조합을 만듭니다.

단어 목록이 있어요. 예를 들어:

a=(ENCFF002CDP ENCFF002COQ ENCFF002DAJ ENCFF002DCM)  

가능한 모든 조합을 실행하는 도구를 사용하고 싶습니다. 예를 들면 다음과 같습니다.

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

가능한 모든 조합에 대해 등등.

어떻게 해야 하나요?

답변1

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

위의 이중 루프는 주어진 ID의 모든 조합을 제공하지만 동일한 ID와 자체의 조합을 무시하고 A조합이 이미 사용된 경우 ID를 자체와 결합하는 것을 방지합니다.BBA

예제 배열은 다음과 같이 bedtool실행됩니다.

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

답변2

이건 어때?

조합.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가 생성되어야 합니다.

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

답변3

이것은 awk 버전입니다.
시스템에서 bedtools 명령을 실행해야 하는 경우 "echo" 및 "\\"를 제거하십시오.

$ 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

관련 정보