다른 필드가 일치하는 경우 열 조인

다른 필드가 일치하는 경우 열 조인

6개 필드가 있는 탭으로 구분된 파일이 있습니다. $1, $2, 및 필드가 일치하는 경우 $4해당 필드를 하나의 행으로 병합하고 필드를 각 값 과 연결하고 싶습니다 .$5$6$3/

입력.txt

1   109860777   COSN18724706    CT  C   SORT1
1   154842199   COSM3685920 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   154842199   COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   1684347 COSM1320773 C   CCCT    NADK
1   1684347 COSM1320774 C   CCCT    NADK
1   1684347 COSM5827581 C   CCCT    NADK
1   248801602   COSM246232  T   TCA OR2T35

출력.txt

1   109860777   COSN18724706    CT  C   SORT1
1   154842199   COSM3685920/COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   1684347 COSM1320773/COSM1320774/COSM5827581 C   CCCT    NADK
1   248801602   COSM246232  T   TCA OR2T35

awk를 사용해 보았지만 올바른 방향으로 push를 사용할 수 있습니다.

답변1

해결책:

awk '{ k=$1 FS $2 FS $4 FS $5 FS $6;  a[k]=(k in a)? a[k]"/"$3 : $3 }
     END{ for(i in a) { 
              split(i,b,FS); b[3]=a[i]"\t"b[3]; r=""; 
              for(j=1;j<=NF;j++) { 
                  r=(r!="")? r"\t"b[j] : b[j] 
              } 
              print r 
        } 
     }' input

산출:

1   1684347 COSM1320773/COSM1320774/COSM5827581 C   CCCT    NADK    
1   109860777   COSN18724706    CT  C   SORT1   
1   154842199   COSM3685920/COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3   
1   248801602   COSM246232  T   TCA OR2T35

세부 사항:

  • k=$1 FS $2 FS $4 FS $5 FS $6- 복잡한 배열 키

  • a[k]=(k in a)? a[k]"/"$3 : $3- 레코드의 세 번째 필드 값을 일치/그룹화 필드와 연결합니다.

  • split(i,b,FS)- 구분 기호로 배열 키 분할

  • b[3]=a[i]"\t"b[3]- 결과(세 번째 필드) 값을 해당 위치에 삽입합니다.

답변2

코드 모양을 위해 GNU sed다음과 같이 할 수 있습니다.

sed -Ee '
   $!N
   s|^(\S+\t\S+\t)(\S+)(\t\S+\t\S+\t\S+)(\n)\1(\S+)\3$|\4\1\2/\5\3|
   /^\n/!P;D
' yourfile

결과

1       109860777       COSN18724706    CT      C       SORT1
1       154842199       COSM3685920/COSM5827506 G       GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1       1684347 COSM1320773/COSM1320774/COSM5827581     C       CCCT    NADK
1       248801602       COSM246232      T       TCA     OR2T35

피복재

  • GNU sed확장 RE를 활성화하는 옵션과 함께 호출됩니다 -E.
  • eof가 아닌 경우 패턴의 다음 줄을 로드합니다.
  • 필드 사이에 선행/후행 TAB이 없거나 여러 TAB이 없다고 가정합니다.
  • $1 $2를 \1에 넣고, $3를 \2에 넣고, $4, $5, $6를 \3에 넣습니다.
  • 그런 다음 그림과 같이 하위 구성 요소를 만들어 보십시오. 성공하면 BOL에서 슬래시와 줄 바꿈으로 구분하여 다음 줄의 $3를 현재 줄의 $3로 이동합니다.
  • 그런 다음 서브루틴이 실패하면 현재 행(OTW)을 인쇄하고 패턴 공간의 내용으로 sed 코드를 다시 실행합니다.

답변3

Python을 사용하여 이를 수행하는 한 가지 방법은 다음과 같습니다.

암호:

from collections import OrderedDict
data = OrderedDict()
with open('file1', 'rU') as f:
    for line in f.readlines():
        line = line.split('\t')
        key = tuple(line[:2] + line[3:])
        data.setdefault(key, []).append(line[2])

with open('file2', 'w') as f:
    for k, v in data.items():
        f.write('\t'.join([k[0], k[1], '/'.join(v)] + list(k[2:])))

결과:

1   109860777   COSN18724706    CT  C   SORT1
1   154842199   COSM3685920/COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   1684347 COSM1320773/COSM1320774/COSM5827581 C   CCCT    NADK
1   248801602   COSM246232  T   TCA OR2T35

관련 정보