如何计算文件中的值

如何计算文件中的值

如何计算给定的值:第一列包含 Contig 值

Contig
c_000000000002
c_000000000002
c_000000000002
c_000000000002
c_000000000003
c_000000000003
c_000000000003
c_000000000003
c_000000000008
c_000000000008
c_000000000013
c_000000000013

我想计算列中的值并找到重叠群的相应值。 “Contig”和“Count_of_Contig”应该用制表符分隔。

Contig Count_of_contig
c_000000000002 2_1
c_000000000002 2_2
c_000000000002 2_3
c_000000000002 2_4
c_000000000003 3_1
c_000000000003 3_2
c_000000000003 3_3
c_000000000003 3_4
c_000000000008 8_1
c_000000000008 8_2
c_000000000013 13_1
c_000000000013 13_2

我想为此请求一个单行linux命令。标头不必出现在输出中。此处展示只是为了轻松理解输出。

答案1

轻松使用awk

awk -F _ -v OFS='\t' '
  NR == 1 {print $0, "Count_of_contig"; next}
  {print $0, 0+$2 "_" ++count[$0]}' < input_file

答案2

这是我能想到的最好的使用方法磨坊主

$ mlr --pprint put '
    @n[$Contig] += 1; 
    $Count_of_contig = sub($Contig,"c_0*(.*)","\1_" . @n[$Contig])
  ' input
Contig         Count_of_contig
c_000000000002 2_1
c_000000000002 2_2
c_000000000002 2_3
c_000000000002 2_4
c_000000000003 3_1
c_000000000003 3_2
c_000000000003 3_3
c_000000000003 3_4
c_000000000008 8_1
c_000000000008 8_2
c_000000000013 13_1
c_000000000013 13_2

出于多种原因,这令人沮丧:

  1. 没有 ++ 或 --,强制使用单独的语句来增加映射值

  2. 如果你尝试splitasplitax这个$Contig领域,似乎没有办法说服它000000000013是一个小数而不是八进制整数。因此,丑陋的正则表达式sub

您可以改为使用step动词来进行每个类别的计数:

$ mlr --pprint step -a counter -f Contig -g Contig then put '
    $Contig_counter = sub($Contig,"c_0*([0-9]+)","\1_" . $Contig_counter)
  ' then rename Contig_counter,Count_of_contig input
Contig         Count_of_contig
c_000000000002 2_1
c_000000000002 2_2
c_000000000002 2_3
c_000000000002 2_4
c_000000000003 3_1
c_000000000003 3_2
c_000000000003 3_3
c_000000000003 3_4
c_000000000008 8_1
c_000000000008 8_2
c_000000000013 13_1
c_000000000013 13_2

如果不需要为值添加前缀,这可能是首选方法:

$ mlr --pprint step -a counter -f Contig -g Contig input
Contig         Contig_counter
c_000000000002 1
c_000000000002 2
c_000000000002 3
c_000000000002 4
c_000000000003 1
c_000000000003 2
c_000000000003 3
c_000000000003 4
c_000000000008 1
c_000000000008 2
c_000000000013 1
c_000000000013 2

相关内容