combinação de seqüência de caracteres baseada em duas colunas

1

Estou tentando obter a combinação de seqüência de caracteres disponível para cada pilha de dados,

o arquivo de entrada contém duas colunas: col1 é um nome genérico, col2 é o nome de vários estressores.

        gene1   FishKairomones
        gene1   Microcystin
        gene1   Calcium
        gene2   Cadmium
        gene2   Microcystis
        gene2   FishKairomones
        gene2   Phosphorous
        gene3   FishKairomones
        gene3   Microcystin
        gene3   Phosphorous
        gene3   Cadmium

Então, aqui da tabela, o gene 1 é responsivo a 3 estressores, fishkairomones, microcistina e cálcio.

Gostaria de obter uma tabela de pares como esta:

    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

Como você pode ver, o gene 1 FishKairomones está ligado ao gene 1 microcistina, gene1 fishkairomones está ligado ao cálcio, e o gene 1 microcistina está ligado ao gene 1 cálcio. Da mesma forma, gostaria de fazer isso para todos os genes.

Às vezes, o gene pode ter 3 estressores, às vezes 4 e assim por diante.

Eu tentei o código aqui: Ferramenta de linha de comando para" cat "expansão em pares de todas as linhas em um arquivo

Isso cria todas as combinações de pares do arquivo inteiro, o que não é o que eu quero.

    
por biobudhan 07.11.2017 / 11:45

1 resposta

2
Solução

AWK (funciona mesmo para linhas de entrada não ordenadas ):

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

A saída:

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
    
por 07.11.2017 / 12:14