아래와 같은 데이터 세트가 있습니다.
>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
또 다른 솔루션은 다른 awk 메커니즘을 사용한다는 점에서 Sundeep의 솔루션과 다릅니다.
awk '
$2 ~ /len=/ { $2=++ctr}
{ print }
' < file
$2 ~ /len=/
두 번째 필드에 포함된 행만 일치하며 len=
해당 행에서는 두 번째 필드가 카운터로 대체됩니다.
그런 다음 첫 번째 규칙과 일치하는지 여부에 관계없이 모든 줄이 인쇄됩니다.
주어진 초기 값에서 카운터를 시작하려는 경우(예: 입력이 여러 파일에 분산되어 있는 경우) 다음을 수행할 수 있습니다.
awk '
BEGIN { ctr=12345 }
$2 ~ /len=/ { $2=ctr++ }
{ print }
' < file