在 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