각 데이터 스택에 사용할 수 있는 문자열의 쌍별 조합을 얻으려고 합니다.
입력 파일에는 두 개의 열이 포함되어 있습니다. col1은 유전자 이름이고 col2는 다양한 스트레스 요인의 이름입니다.
gene1 FishKairomones
gene1 Microcystin
gene1 Calcium
gene2 Cadmium
gene2 Microcystis
gene2 FishKairomones
gene2 Phosphorous
gene3 FishKairomones
gene3 Microcystin
gene3 Phosphorous
gene3 Cadmium
따라서 표에서 볼 수 있듯이 gene1은 생선 카이로몬, 마이크로시스틴, 칼슘 등 3가지 스트레스 요인에 반응합니다.
나는 다음과 같은 쌍별 테이블을 얻고 싶습니다.
gene1 FishKairomones gene1 Microcystin
gene1 FishKairomones gene1 Calcium
gene1 Microcystin gene1 Calcium
gene2 Cadmium gene2 Microcystis
gene2 Cadmium gene2 FishKairomones
gene2 Cadmium gene2 Phosphorous
gene2 Microcystis gene2 FishKairomones
gene2 Microcystis gene2 Phosphorous
gene2 FishKairomones gene2 Phosphorous
보시다시피, 유전자 1 피쉬 카레인은 유전자 1 마이크로시스틴과 관련이 있고, 유전자 1 피쉬 카레인은 유전자 1 칼슘과 관련이 있으며, 유전자 1 마이크로시스틴은 유전자 1 칼슘과 관련이 있습니다. 다시 말하지만, 저는 모든 유전자에 대해 이 작업을 수행하고 싶습니다.
때때로 유전자는 3개의 스트레스 요인을 가질 수 있고, 때로는 4개 등을 가질 수 있습니다.
나는 여기에서 코드를 시험해 보았다."cat" 파일의 모든 줄을 쌍으로 확장하기 위한 명령줄 도구
이것은 내가 원하는 것이 아닌 전체 파일의 모든 쌍별 조합을 생성합니다.
답변1
AWK
솔루션 (심지어무질서한입력 라인):
awk '{ a[$1]=($1 in a? a[$1]",":"")$2 } # grouping `stressors` by `gene` names
END {
for (k in a) { # for each `gene`
len=split(a[k], b, ","); # split `stressors` string into array b
for (i=1;i<len;i++) # construct pairwise combinations
for (j=i+1;j<=len;j++) # between `stressors`
print k,b[i],k,b[j]
}
}' file
산출:
gene1 FishKairomones gene1 Microcystin
gene1 FishKairomones gene1 Calcium
gene1 Microcystin gene1 Calcium
gene2 Cadmium gene2 Microcystis
gene2 Cadmium gene2 FishKairomones
gene2 Cadmium gene2 Phosphorous
gene2 Microcystis gene2 FishKairomones
gene2 Microcystis gene2 Phosphorous
gene2 FishKairomones gene2 Phosphorous
gene3 FishKairomones gene3 Microcystin
gene3 FishKairomones gene3 Phosphorous
gene3 FishKairomones gene3 Cadmium
gene3 Microcystin gene3 Phosphorous
gene3 Microcystin gene3 Cadmium
gene3 Phosphorous gene3 Cadmium