与えられた値を計算する方法:最初の列には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
これに対して1行の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
少数8進整数ではない。したがって、醜い正規表現です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