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

辦法-pep在應用 -e" 給出的腳本後打印每一行。腳本本身只是一個替換運算符 ( s/old/new/),帶有/g“全局”標誌(匹配該行中的每個匹配項),並且它/e允許我們右手執行代碼最後,正規表示式將匹配a和 a\d+之間的一個或多個數字 () ,將數字捕獲為,然後替換將列印捕獲的數字加上 32 和。YRPR$1YRPR

答案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,

相關內容