awk:按升序计算重复次数和数量

awk:按升序计算重复次数和数量

在 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 操作,即打印该行。tssc...?...:...if...then...else
1

相关内容