多行中某个位置的一系列数字

多行中某个位置的一系列数字

我有一个数据集,如下所示:

>TRINITY_DN37_c0_g1_i1 len=333 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 len=356 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 len=394 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT

我需要将字符串“len=XXX”替换为一系列数字,以便唯一地标记每个序列,该字符串在数千行中处于同一位置。理想情况下,我在想这样的事情:

>TRINITY_DN37_c0_g1_i1 1 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 2 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 3 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT

我正在使用 OSX。

有任何想法吗?

答案1

$ cat ip.txt 
>TRINITY_DN37_c0_g1_i1 len=333 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 len=356 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 len=394 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT

$ awk '/len=/{sub(/len=[0-9]+/,++c)} 1' ip.txt 
>TRINITY_DN37_c0_g1_i1 1 path=[361:0-43 362:44-332] [-1, 361, 362, -2]
GCCGCCATCATGGATGCCAGCCGTGTGCAGCCCATCAAGCTTGCCAGAGTCACCAAGGTT
>TRINITY_DN37_c0_g2_i1 2 path=[359:0-66 360:67-355] [-1, 359, 360, -2]
ACGTGACCCCCTTTCTGTCTCAAGCCGCCATCATGGATGCCAGTCGTGTGCAGCCCATCA
>TRINITY_DN15_c1_g1_i1 3 path=[372:0-393] [-1, 372, -2]
GCACTTACCATGCATGGAAGGCAAATGCCATCGGAAGGTCTGCAAAGACTGTTAGGGAGT
  • /len=/与此模式匹配的行
  • sub(/len=[0-9]+/,++c)将匹配行模式的第一次出现替换len=[0-9]+为递增值c(默认值为0


或者与perl

perl -i -pe 's/len=\d+/++$c/e' ip.txt

-i选项用于就地编辑

答案2

另一种解决方案与 Sundeep 的解决方案不同,使用另一种 awk 机制。

awk '
$2 ~ /len=/ { $2=++ctr}
{ print }
' < file     

$2 ~ /len=/仅匹配第二个字段包含的行len=,并且在这些行中,第二个字段被计数器替换。

然后,所有行都会被打印,无论它们是否匹配第一条规则。

如果您想从给定的初始值启动计数器(例如,如果您的输入分散在多个文件中),您可以执行以下操作:

awk '
BEGIN { ctr=12345 }
$2 ~ /len=/ { $2=ctr++ }
{ print }
' < file

相关内容