
次のようなファイルに値を追加する方法についてのアイデアを探しています。
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 で指定されたスクリプトを適用した後、すべての行を出力します。スクリプト自体は、 "global"s/old/new/
フラグ/g
(行のすべての出現に一致) と、/e
演算子の右側にあるコードを実行できる が付いた置換演算子 ( ) にすぎません。最後に、正規表現は、 aと a の\d+
間の 1 つ以上の数字 ( ) に一致し、数字を としてキャプチャします。その後、置換によって、キャプチャされた数字に 32 を加えた と が出力されます。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,