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