입력 데이터 크기 확장 시 정렬 기능이 작동하지 않습니다.

입력 데이터 크기 확장 시 정렬 기능이 작동하지 않습니다.

그래서 일주일 전에 제가 질문을 했습니다. > 여기 , 문제는 정렬에 관한 것입니다. 이 코드를 사용하여 파일을 정렬하고 생성하는 경우:

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

예제에서 사용하고 있는 파일에서는 작동하지만 더 큰 실제 파일에서 사용하면 정렬이 작동하지 않는 것 같습니다.

LC_ALL=C를 사용하기 전에 이 문제를 해결했지만 한 번만 작동하는 것 같아서 실제 문제가 무엇인지 모르겠습니다. 해당 열을 구체적으로 인쇄하고 정렬하면 작동하지만 이 코드에서는 작동하지 않습니다.

한꺼번에 처리할 일이 너무 많기 때문이 아닐까요? 서로 다른 데이터에 주석이 달린 151개의 열이 있고 43열과 151열만 정렬하고 싶지만 여전히 새 정렬 파일이 필요합니다. 도와주세요.

답변1

예, 열은 위치, 즉 행 시작 부분부터의 문자 수에 따라 정의되므로 이전 데이터 예제의 형식을 사용하겠습니다. 불행하게도 발견한 바와 같이 이러한 열 중 하나라도 비어 있으면 사용하려고 했던 도구는 해당 열을 전혀 열로 계산하지 않습니다.

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

이해하기 더 쉽기 때문에 Python으로 빠른 스크립트를 작성했습니다. 명령줄에 두 개의 파일이 제공되면 줄의 하드코딩된 부분을 기준으로 정렬되지만 이는 분명히 변경될 수 있습니다. 현재는 입력한 각 필드에 대해 목록을 한 번씩 정렬합니다. 그러나 비교를 위해 단일 부동 소수점 대신 원하는 순서로 부동 소수점 튜플을 반환하도록 정렬 함수를 업데이트하는 것도 마찬가지로 가능합니다.

#! /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])

따라서 다른 질문에 제공된 파일을 사용하면 다음과 같이 끝납니다.

~$>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

둘 다 동일한 출력을 제공합니다.

~$>./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

그러나 정렬 열에 다음과 같은 간격이 있으면 해당 요소가 마지막 행이 됩니다.

~$>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

이 출력을 기반으로 파이프를 통해 전체 목록의 "유일한" 파일에 있는 해당 줄의 최종 위치를 나열할 수도 있습니다.

~$>./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

grep은 문자열을 정렬 -F하고( ) 줄 번호를 출력하며( -n) 파일에서 검색할 문자열을 읽습니다( -f unique_data.txt).

죄송합니다. 세상에는 많은 예가 있습니다. 필드가 많은 경우 해야 할 어색한 일 중 하나는 필드의 시작과 끝을 식별하고 더 큰 파일에 대해 가져올 수 있는 안정적인 방법이 있는지 확인하는 것입니다.

관련 정보