awk는 필드에 값을 추가합니다.

awk는 필드에 값을 추가합니다.

다음과 같이 내 파일의 필드에 값을 추가하는 방법에 대한 아이디어를 찾고 있습니다.

line(001)=YR200PR1030,YR230PR1580,YR340PR2016,
          YR450PR2450,
          PRF3500,
line(002)=YR200PR452,YR230PR740,YR340PR1500,
          YR450PR2120,
          PRF2800,

YR과 PR 사이의 모든 값에 대해 32개의 값을 추가하고 싶습니다. 예를 들면 다음과 같습니다.
YR200PR1030-->YR232PR1030

어떤 아이디어가 있나요? 감사해요.

답변1

YR와 사이에 있는 숫자 값을 각각 증가시켜야 하는 경우 PR다음을 시도해 볼 수 있습니다.

$ perl -pe 's/YR(\d+)PR/sprintf("YR%sPR",$1 + 32)/eg' file
line(001)=YR232PR1030,YR262PR1580,YR372PR2016,
          YR482PR2450,
          PRF3500,
line(002)=YR232PR452,YR262PR740,YR372PR1500,
          YR482PR2120,
          PRF2800,

또는 해당 위치에서 파일을 편집합니다.

perl -i -pe 's/YR(\d+)PR/sprintf("YR%sPR",$1 + 32)/eg' file

방법 -pe"-e"에 의해 제공된 스크립트를 적용한 후 각 줄을 인쇄합니다. 스크립트 자체는 "전역" 플래그 s/old/new/가 있는 대체 연산자( ) 일 뿐이며 /g(줄의 모든 항목과 일치) 다음 위치 /e에서 코드를 오른쪽으로 실행할 수 있습니다. end , 정규 표현식은 \d+a 와 a() 사이의 하나 이상의 숫자와 일치하고 숫자를 로 캡처하며 교체는 캡처된 숫자에 32 및 를 더한 값을 인쇄합니다.YRPR$1YRPR

답변2

모든 UNIX 시스템의 모든 쉘에서 awk를 사용하십시오.

$ cat tst.awk
{
    while ( match($0,/YR[0-9]+PR/) ) {
        printf "%s%d", substr($0,1,RSTART+1), substr($0,RSTART+2)+32
        $0 = substr($0,RSTART+RLENGTH-2)
    }
    print
}

.

$ awk -f tst.awk file
line(001)=YR232PR1030,YR262PR1580,YR372PR2016,
          YR482PR2450,
          PRF3500,
line(002)=YR232PR452,YR262PR740,YR372PR1500,
          YR482PR2120,
          PRF2800,

답변3

주문하다

for ((j=1;j<=2;j++)); do awk -v j="$j" -F "," 'NR==j && ORS=","{for(i=1;i<=NF;i++){if ($i ~ /^YR[0-9]*PR[0-9]*/){print substr($i,1,2)substr($i,3,3)+32substr($i,6)}else {print $i}}}' p.txt; echo -e "\n"; done

산출

YR232PR1030,YR262PR1580,YR372PR2016,YR482PR2450,

YR232PR452,YR262PR740,YR372PR1500,YR482PR2120,PRF2800,

관련 정보