
내 파일이 다음과 같은 필드에 값을 추가하는 방법에 대한 아이디어를 찾고 있습니다.
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/
있는 대체 연산자( ) 일 뿐이며 이를 통해 오른쪽에서 코드를 실행할 수 있습니다. 마지막으로 정규식은 a 와 a 사이의 하나 이상의 숫자( ) 와 일치하여 숫자를 로 캡처한 다음 교체는 캡처된 숫자에 32 및 을 더한 값을 인쇄합니다 ./g
/e
\d+
YR
PR
$1
YR
PR
답변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,