A função Sort não funciona

0

Há uma semana, fiz uma pergunta, > aqui A questão era sobre a classificação. Se eu usar esse código para classificar e criar arquivos:

tail -n +2 File1.txt |
  split -l1 --filter='
    { 
      head -n 1 File2.txt &&
        cat <(tail -n +2 File2.txt) - |
        sort -n -r -k4 
   ; } > "$FILE"'

ele funciona nos arquivos que eu uso nesse exemplo, mas quando eu uso isso em meus arquivos reais que são maiores, parece que a ordenação não funciona.

Eu consertei esse problema antes usando LC_ALL = C, mas parece que funcionou apenas uma vez, então não sei qual é o problema real. se eu especificamente imprimir e classificar a coluna funciona, mas não com o lado deste código ..

Talvez porque seja muito em tempo para fazer? Eu tenho 151 colunas com dados diferentes anotados, e eu só quero classificar as colunas 43 e 151, mas ainda preciso dos novos arquivos classificados. Por favor me ajude.

    
por Osman Altun 04.01.2018 / 10:13

1 resposta

0

direito, para isso eu estou indo do formato de exemplos anteriores de dados, dado que uma coluna é definida por posição, ou seja, quantos caracteres a partir do início da linha. Infelizmente, como você descobriu, se alguma dessas colunas estiver em branco, as ferramentas que você está tentando usar não as contará como uma coluna:

col 1   col 2       col 3       col 4   col 5 
chr3    31663820    31663820    0.713   3

col 1               col 2       col 3   col 4 
chr3                33093371    3.753   4

Acabei de escrever um script rápido em Python, já que me senti um pouco mais fácil de descobrir. quando recebe seus dois arquivos na linha de comando, os classifica de acordo com uma parte codificada da linha, mas isso pode obviamente ser alterado. No momento, também classificaria a lista uma vez para cada campo digitado. Mas, novamente, seria possível atualizar a função de classificação para retornar uma tupla de floats na ordem desejada, em vez de um único float para as comparações.

#! /usr/bin/python

# own_sort.py
# ./own_sort.py 'unique values file' 'duplicate values file'

# allows access to command line arguments.
import sys


# this is just to get some example inputs
test_line = 'chr3    39597927    39597927    8.721   5'
phylop_col = (test_line.find('8.721'), test_line.find('8.721')+7)


# this will return a sorting function with the particular column start and end
# positions desired, so its easy to change
def return_sorting_func(col_start, col_end):
    # a sorting key for pythons built in sort. the key must take a single element, 
    # and return something for the sort function to compare.
    def sorting_func(line):
        # use the exact location, ie how many characters from the start of the line.
        field = line[phylop_col[0]: phylop_col[1]]
        try:
            # if this field has a float, return it
            return float(field)
        except ValueError:
            # else return a default
            return float('-inf')  # will give default of lowest rank
            # return 0.0  # default value of 0
    return sorting_func


if __name__ == '__main__':
    uniq_list = []
    dups_list = []

    # read both files into their own lists
    with open(sys.argv[1]) as uniqs, open(sys.argv[2]) as dups:
        uniq_list = list(uniqs.readlines())
        dups_list = list(dups.readlines())

    # and sort, using our key function from above, with relevant start and end positions
    # and reverse the resulting list.
    combined_list = sorted(uniq_list[1:] + dups_list[1:], 
            key=return_sorting_func(phylop_col[0], phylop_col[1]), 
            reverse=True)

    # to print out, cut off end of line (newline) and print header and footer around other 
    # results, which can then be piped from stdout.
    print(dups_list[0][:-1])
    for line in combined_list:
        print(line[:-1])
    print(dups_list[0][:-1])

usando os arquivos da outra pergunta, acabei com:

~$>cat unique_data.txt 
chromosoom  start    end       phylop   GPS
chr1    28745756    28745756    7.905   5   
chr1    31227215    31227215    10.263  5
chr1    47562402    47562402    2.322   4
chr1    64859630    64859630    1.714   3
chr1    70805699    70805699    1.913   2
chr1    89760653    89760653    -0.1    0
chr1    95630169    95630169    -1.651  -1
~$>cat dups_data.txt 
chromosoom  start    end       phylop   GPS
chr3    15540407    15540407    -1.391  -1
chr3    30648039    30648039    2.214   3
chr3    31663820    31663820    0.713   3
chr3    33093371    33093371    3.753   4
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    39597927    39597927    8.721   5
~$>cat dups_data_with_gaps_1.txt 
chromosoom  start    end       phylop   GPS
chr3    15540407    15540407    -1.391  -1
chr3    30648039    30648039    2.214   3
chr3    31663820    31663820    0.713   3
chr3                33093371    3.753   4
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    39597927                8.721   5

que ambos fornecem a mesma saída de

~$>./own_sort.py unique_data.txt dups_data_with_gaps_1.txt
chromosoom  start    end       phylop   GPS
chr1    31227215    31227215    10.263  5
chr3    39597927    39597927    8.721   5
chr1    28745756    28745756    7.905   5   
chr3    33093371    33093371    3.753   4
chr1    47562402    47562402    2.322   4
chr3    30648039    30648039    2.214   3
chr1    70805699    70805699    1.913   2
chr1    64859630    64859630    1.714   3
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    31663820    31663820    0.713   3
chr1    89760653    89760653    -0.1    0
chr3    15540407    15540407    -1.391  -1
chr1    95630169    95630169    -1.651  -1
chromosoom  start    end       phylop   GPS

mas se a coluna de classificação tiver espaços em branco como o seguinte, esse elemento terminará como a última linha:

~$>cat dups_data_with_gaps_2.txt 
chromosoom  start    end       phylop   GPS
chr3    15540407    15540407    -1.391  -1
chr3    30648039    30648039            3
chr3    31663820    31663820    0.713   3
chr3    33093371    33093371    3.753   4
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    39597927    39597927    8.721   5
~$>./own_sort.py unique_data.txt dups_data_with_gaps_2.txt 
chromosoom  start    end       phylop   GPS
chr1    31227215    31227215    10.263  5
chr3    39597927    39597927    8.721   5
chr1    28745756    28745756    7.905   5   
chr3    33093371    33093371    3.753   4
chr1    47562402    47562402    2.322   4
chr1    70805699    70805699    1.913   2
chr1    64859630    64859630    1.714   3
chr3    37050398    37050398    1.650   2
chr3    38053456    38053456    1.1     1
chr3    31663820    31663820    0.713   3
chr1    89760653    89760653    -0.1    0
chr3    15540407    15540407    -1.391  -1
chr1    95630169    95630169    -1.651  -1
chr3    30648039    30648039            3
chromosoom  start    end       phylop   GPS

na saída disso, você também pode executar um pipeline para listar onde essas linhas do arquivo 'exclusivo' acabaram nas listagens gerais.

~$>./own_sort.py unique_data.txt dups_data.txt | head -n -1 | tail -n +2 | grep -Fn  -f unique_data.txt 
1:chr1    31227215    31227215    10.263  5
3:chr1    28745756    28745756    7.905   5   
5:chr1    47562402    47562402    2.322   4
7:chr1    70805699    70805699    1.913   2
8:chr1    64859630    64859630    1.714   3
12:chr1    89760653    89760653    -0.1    0
14:chr1    95630169    95630169    -1.651  -1

o grep irá ordenar as strings ( -F ) e produzirá o número da linha ( -n ) e lerá as strings para pesquisar a partir de um arquivo ( -f unique_data.txt )

Desculpe, há muitos exemplos. A coisa estranha que você precisa fazer se tiver muitos campos é ter certeza de que tem uma maneira confiável de identificar o início e o fim do campo e obter isso para seus arquivos maiores.

    
por 16.01.2018 / 17:34