Extraindo todas as colunas contendo uma lista de termos

0

Eu tenho um arquivo de dados ( data.txt ) com ~ 320 linhas e ~ 1800 colunas (1,9 MB), e preciso extrair algumas colunas (para todas as linhas). O layout geral de data.txt é o seguinte:

 ID           Adipocyte - breast, donor2.CNhs11969.11327-117E4   ....
HGNC:8888                        0                               .... 
HGNC:9999                     123.92                             ....
HGNC:1000                      9.31                              .... 

Eu tenho uma lista das colunas que preciso extrair (em um arquivo list.txt ), mas essa lista é composta apenas do identificador CNhsXXXXX no termo da coluna (ou seja, para o exemplo acima, a lista conteria apenas CNhs11969 , não o termo completo Adipócito - mama, doador2.CNhs11969.11327-117E4 ).

Eu usei o grep para uma lista de linhas antes, mas não para colunas. Eu dei uma olhada, mas não consegui encontrar uma maneira de usar várias colunas com vários termos. Eu sou muito novo no unix (sou biólogo, pouca experiência em computação), então não tenho certeza se o grep pode fazer isso.

Qualquer ajuda seria apreciada.

EDIT: Meu exemplo de saída seria apenas ~ 850 das ~ 1800 colunas (somente aquelas contendo os termos no meu arquivo list.txt ). Exemplo: Se minha lista continha apenas CNhs5006 e CNhs7021, eu desejaria apenas colunas contendo esses termos no cabeçalho. Exemplo do data.txt :

ID        XXXCNhs5006XXX   XXXCNhs6025XXX   XXXCNhs7021XXX   XXXCNhs8095XXX
HGNC:1111     1.23                 1.53             9.21            0
HGNC:2222     1.95                73.92               0           123.29 

Exemplo da saída desejada:

ID         XXXCNhs5006XXX   XXXCNhs7021
HGNC:1111          1.23          9.21
HGNC:2222          1.95           0

Meu list.txt é apenas uma lista simples de termos (1 coluna, ~ 850 linhas, cada linha contendo 1 termo de pesquisa). Exemplo:

CNhs1111 CNhs2222 CNhs3333 CNhs4444

    
por DiscoA 12.07.2016 / 07:41

2 respostas

0

Suponho que o OP possa fazer o seguinte:

  1. Leia o cabeçalho data.txt e converta colunas em linhas
  2. Grep das linhas para obter números que correspondam a list.txt
  3. Passe data.txt através do cut

Se as colunas forem delimitadas por tabulações, o script pode ser:

cut -f 1,$(
    head -n1 data.txt |
    tr '\t' '\n' |
    grep -nf list.txt |
    sed ':a;$!N;s/:[^\n]*\n/,/;ta;s/:.*//'
) data.txt
    
por 12.07.2016 / 08:17
0

Você pode tentar algo assim:

awk  -F'\t' -f script.awk column.names data

em que script.awk é:

NR == FNR { columns[NR] = $0; next }
NR > FNR && FNR == 1 {
    for (i = 1; i <= NF; i++) {
        for (j = 1; j < NR; j++) {
            if ($i ~ columns[j]) {
                selected[i] = 1;
                break;
            }
        }
    }
}
{
    for (i = 1; i <= NF; i++) {
        if (i in selected) printf $i "\t";
    }
    print "";
}

@ A abordagem de Costas é legal. No entanto, acho que poderia ser um pouco simplificado:

head -n1 data | tr '\t' '\n' | grep -nf column.names | cut -f1 -d: \
  | paste -sd, | xargs -I{} cut -f {} data
    
por 12.07.2016 / 08:40

Tags