awk에서는 탭으로 구분된 파일에서 중복된 값을 세고 오름차순으로 번호를 다시 매겨야 합니다.
3열의 행을 비교해야 합니다. 일치하는 항목이 없으면 tss1이 열 5에 인쇄됩니다. 그렇지 않으면 tss1, tss2, tss3 등이 5열에 인쇄됩니다.
내 시도:awk -F'\t' '{$3=$3"\t" "tss"++cnt} 1' file
Input file <tab separated>
chrX Gripap1 7367120 7367120
chrX Pim2 7455431 7455431
chrX Pola1 90877494 90877494
chrX Pcyt1b *90900201* 90900201
chrX Pcyt1b *90900201* 90920450
산출
Output file <tab separated>
chrX Gripap1 7367120 7367120 tss1
chrX Pim2 7455431 7455431 tss1
chrX Pola1 90877494 90877494 tss1
chrX Pcyt1b *90900201* 90900201 tss1
chrX Pcyt1b *90900201* 90920450 tss2
답변1
다음과 같은 스크립트가 awk
작동해야 합니다.
NR == 1 { print }
NR > 1 {
if( $3 == last ) {
count++
} else {
count = 1
}
last = $3
print $1, $2, $3, $4, "tts" count
}
OFS
기본값은 탭 문자이며, 탭으로 구분된 입력은 탭 문자에서도 작동합니다. 따라서 다음 awk 스크립트를 사용하십시오 script.awk
.
$ awk -f script.awk inputfile
답변2
awk 함수를 사용하여 세 번째 필드에서 숫자가 아닌 항목을 제거할 수 있습니다 gensub
.[^0-9]
awk -v c=1 '{$(NF+1)="tss"((gensub("[^0-9]","","g",$3)==$4)?c:++c)}1' OFS='\t' file
이렇게 하면 세 번째와 네 번째 열의 비교를 기반으로 개수가 포함된 문자열인 새 열이 생성됩니다 $(NF+1)
. 이는 와 동일한 삼항 연산자를 사용하여 수행됩니다. 마지막 것은 행을 인쇄하는 기본 awk 작업입니다.tss
c
...?...:...
if...then...else
1