그래서 일주일 전에 제가 질문을 했습니다. > 여기 , 문제는 정렬에 관한 것입니다. 이 코드를 사용하여 파일을 정렬하고 생성하는 경우:
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
).
죄송합니다. 세상에는 많은 예가 있습니다. 필드가 많은 경우 해야 할 어색한 일 중 하나는 필드의 시작과 끝을 식별하고 더 큰 파일에 대해 가져올 수 있는 안정적인 방법이 있는지 확인하는 것입니다.