여러 줄의 한 위치에 있는 숫자 범위

여러 줄의 한 위치에 있는 숫자 범위

아래와 같은 데이터 세트가 있습니다.

>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

관련 정보