我正在寻找有关如何向我的文件的字段添加值的想法,如下所示:
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
”p在应用 -e" 给出的脚本后打印每一行。脚本本身只是一个替换运算符 ( s/old/new/
),带有/g
“全局”标志(匹配该行中的每个匹配项),并且它/e
允许我们右手执行代码最后,正则表达式将匹配a和 a\d+
之间的一个或多个数字 () ,将数字捕获为,然后替换将打印捕获的数字加上 32 和。YR
PR
$1
YR
PR
答案2
在每个 UNIX 机器上的任何 shell 中使用任何 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,