各データスタックに使用できる文字列のペア別の組み合わせを取得しようとしています。
入力ファイルには2つの列が含まれています。 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