이름이 동일한 형식을 가진 개체 목록이 있습니다( *_region_NNN
여기서는 *
변수 이름을 나타내고 는 NNN
숫자입니다). 동일한 목록을 동일한 순서로 가져와야 하지만 이름의 숫자 부분을 서수로 수정해야 합니다. 개체는 알파벳순으로 정렬됩니다. 동일한 이름( *
)을 가진 모든 객체는 001부터 순차적으로 번호가 지정되어야 합니다.
목록.txt:
BIRC2_region_087
BIRC2_region_089
BIRC2_region_114
BMI1_region_193
BMI1_region_243
CRBN_region_109
CRBN_region_134
CRBN_region_145
CDC20_region_001
CDC20_region_002
CDC20_region_004
CBL_region_002
CBL_region_003
CBL_region_004
CBL_region_005
CBL_region_006
CBL_region_008
CBL_region_009
CBL_region_024
CBL_region_033
CBL_region_042
CBL_region_048
CBL_region_075
CBL_region_076
CBL_region_086
CBL_region_111
CBL_region_112
CBL_region_146
CBL_region_172
CBL_region_248
CBL_region_252
출력.txt
BIRC2_region_001
BIRC2_region_002
BIRC2_region_003
BMI1_region_001
BMI1_region_002
CRBN_region_001
CRBN_region_002
CRBN_region_003
CDC20_region_001
CDC20_region_002
CDC20_region_003
CBL_region_001
CBL_region_002
CBL_region_003
CBL_region_004
CBL_region_005
CBL_region_006
CBL_region_007
CBL_region_008
CBL_region_009
CBL_region_010
CBL_region_011
CBL_region_012
CBL_region_013
CBL_region_014
CBL_region_015
CBL_region_016
CBL_region_017
CBL_region_018
CBL_region_019
CBL_region_020
누구든지 나를 도와줄 수 있나요?
답변1
이것을 사용하면 awk
입력 데이터의 전체/일부를 메모리에 버퍼링할 필요가 없습니다(언급한 데이터가 이미 정렬되어 있으므로).
awk -F'_[^_]*$' 'pre!=$1{ id=0 }
{ pre=$1; printf("%s_%03d\n", $1, ++id) }' infile
_[^_]*$
우리가 최종적으로 정의한 것_<zero-or-more-of-any-characters-but-not-underscore><end-of-line>
필드 구분자로.
[^_]
어떤 의미하나의밑줄 이외의 문자(줄 바꿈 포함)는 <줄 끝> 기준점인 [^_]*
<0개 이상의 문자가 있지만 밑줄은 아님>을 의미합니다 .$
행의 나머지 부분( 에서 액세스 가능 $1
)이 이전 행과 다른 경우 ID 수를 0으로 재설정하고, 그렇지 않으면 $1
앞에 0을 3개 추가하여 ID를 인쇄하고 증가시킵니다.
동적 제로 패딩 제어:
<infile awk -F'_[^_]*$' '{ print $1 }' \
|sort |uniq -c |sort -r \
|awk 'NR==1{ z=length($1) } { for(i=1; i<=$1; i++) printf("%s_%0*d\n", $2, z, i) }'
답변2
awk -F"_" '{printf "%s_%s_%03d\n",$1,$2,++n[$1]}' infile.txt
설명하다:
-F"_"
_
: 필드 구분자 로 사용됨printf
:정의된 형식으로 인쇄:%s
=string,_
=literal 밑줄,%03d
0으로 채워진 3자리 정수,\n
개행++n[$1]
필드 1(영역 ID)의 발생 횟수를 계산하고 카운터를 증가시킵니다. 값을 사용하기 전에 이 작업을 수행합니다(그렇지 않으면 0부터 시작).
답변3
에서와 같은 생각αГsнιn의 답변, 그러나 약간 다르게 수행됩니다.
awk '
{ $0 = substr($0, 0, length - 4) }
$0 != prev { n = 0 }
{ printf "%s_%.3d\n", $0, ++n; prev = $0 }' file
첫 번째 블록은 줄 끝에 있는 기존 세 자리 숫자와 앞의 밑줄을 제거하여 일종의 접두사 문자열을 생성합니다.
n
이전 줄이 현재 줄(새 접두사 문자열)과 다른 경우 중간 블록은 카운터를 0으로 재설정합니다.
마지막 블록은 카운터를 증가시키고 중간에 밑줄이 있는 접두사 문자열 끝에 0으로 채워진 3자리 정수로 출력합니다. 마지막으로 현재 행은 으로 기억됩니다 prev
.