如何计算给定的值:第一列包含 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
出于多种原因,这令人沮丧:
有没有 ++ 或 --,强制使用单独的语句来增加映射值
如果你尝试
splita
或splitax
这个$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