세 파일의 정보를 결합하여 네 번째 파일을 만드는 방법은 무엇입니까?

세 파일의 정보를 결합하여 네 번째 파일을 만드는 방법은 무엇입니까?

세 개의 csv 파일이 있는데 각 파일에는 네 번째 파일을 얻는 데 필요한 정보가 포함되어 있습니다. 나는 장난감 파일을 설명하고 있지만 실제 파일에는 여전히 동일한 모델에 더 많은 열과 행이 포함되어 있습니다.

파일 1은 원본 데이터 파일입니다. "individual"에는 각 "rs"에 대해 하나의 문자가 있습니다. 예를 들어. personal0에는 rs009에 "A"가 있고 rs888에 "T"가 있습니다. :

        Individual0 Individual1 Individual2 Individual3
rs009   A       T       A       A
rs888   T       T       T       T
rs103   C       C       C       C
rs591   A       A       A       A
rs112   A       A       A       A
rs004   C       C       C       C

파일 2는 "그룹"의 "rs" 변수를 집계합니다. 각 "그룹"은 파일 1의 순서대로 정렬된 연속적인 "rs" 변수의 조합입니다. 예를 들어, rs009 및 rs103은 "Group0"이라는 변수에 클러스터링됩니다. "Group0"이 끝나고 "Group1"이 시작되는 경우에는 "Group"을 가질 수 없습니다. 중요한 점은 이 단계에서 일부 "rs" 변수가 필터링된다는 점입니다(예: rs888).

Group0 rs009 rs103
Group1 rs591 rs112 rs004

파일 3은 각 "그룹" 변수가 각 "사람"에 번호를 할당하는 결과 파일입니다. 예를 들어 Individual2의 Group0에는 3이 있고 Group1에는 2가 있습니다.

        Individual0 Individual1 Individual2 Individual3
Group0  1       3       3       3
Group1  3       3       2       3

내가 얻으려는 파일은 파일 1과 유사하지만 파일 3의 특정 "person"에 대해 "group" = 3에 속하지 않은 모든 "rs" 변수는 0으로 설정되고 다른 파일은 해당 정보를 유지합니다. 예를 들어, rs009는 Group0에 속하고(파일 2 참조), 파일 3은 Group0에 "1"이 있음을 개인0에게 알려줍니다. 이는 파일 1에 언급된 문자가 0으로 변경되어야 함을 의미합니다. 이와 대조적으로 Individual1의 경우 File 3은 Group0에 "3"이 있음을 나타내므로 File1의 문자(즉, "T")는 유지되어야 합니다. 필터링된 "rs" 변수는 목록의 이전 변수와 동일한 번호를 갖게 됩니다(즉, rs888은 rs009와 동일한 "그룹" 할당을 갖습니다).

        Individual0 Individual1 Individual2 Individual3
rs009   0       T       A       A
rs888   0       T       T       T
rs103   0       C       C       C
rs591   A       A       0       A
rs112   A       A       0       A
rs004   C       C       0       C

즉, 다음이 필요합니다.

1) 파일 1 가져오기

2) 파일 2의 'rs'가 어느 '그룹'에 속하는지 확인합니다. File2에 'rs'가 없으면 File1의 순서에 따라 이전 'rs'와 동일한 "그룹"에 속합니다.

3) 파일 3의 각 "사람"의 각 "그룹"에 할당된 값을 가져옵니다.

4) 후자의 값이 "3"인 경우 파일 1의 각 "individual"에 할당된 문자(A/C/G/T)를 유지하고, 그렇지 않은 경우 "0"으로 변경합니다.

awk를 사용하여 여러 가지 옵션을 시도했지만 지식이 상당히 제한되어 있어 마침내 필요한 것을 얻을 수 있는 방법을 찾을 수 없었습니다. 이번이 첫 번째 게시물이므로 충분한 정보를 제공할 수 있기를 바랍니다. Perl 스크립트를 실행할 수 있지만 작성할 수는 없습니다. 도움을 주셔서 미리 감사드립니다!

답변1

좋아, 이건 해킹이지만 어쨌든:

이 그룹을 다음과 같은 중간 파일로 사용 file3하고 구문 분석해 보겠습니다 .file2resolved

awk '
    FNR == NR {
        group = $1
        $1 = ""
        groups[group] = $0
    }
    FNR != NR {
        for (i = 2; i <= NF; i++) {
            print $i" "groups[$1]
        }
    }
' <(tail -n+2 file3) file2 > resolved

도착하다:

$ cat resolved
rs009  1 3 3 3
rs103  1 3 3 3
rs591  3 3 2 3
rs112  3 3 2 3
rs004  3 3 2 3

그런 다음 resolved다음과 함께 사용하십시오 file1.

awk '
    FNR == NR {
        group = $1;
        for (i = 2; i <= NF; i++) {
            groups[group][i] = $i
        }
    }
    FNR != NR {
        if ($1 in groups) {
            group = $1
        }
        for (i = 2; i <= NF; i++) {
            if (groups[group][i] != 3) {
                $i = 0
            }
        }
        print
    }

' resolved <(tail -n+2 file1)

다음을 생성합니다.

rs009 0 T A A
rs888 0 T T T
rs103 0 C C C
rs591 A A 0 A
rs112 A A 0 A
rs004 C C 0 C

헤더를 활용 column하고 다시 추가하면 됩니다.

관련 정보