컴퓨팅 개체 목록

컴퓨팅 개체 목록

이름이 동일한 형식을 가진 개체 목록이 있습니다( *_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 밑줄, %03d0으로 채워진 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.

관련 정보