awk добавить значение в поле

Вариант скважины -известного sedодного -хвостовика:

$ sed -e :a -e '$!N;s/\n[[:blank:]]*,/,/;ta' -e 'P;D' file.csv
  ABCD,1234,QWER
  ASDF,2345,VGFT
  "ASDF,12",1212,ASDR 
  1234,ZXCV,ERTT
0
10.08.2020, 19:40
3 ответа

Если вам нужно увеличить числовое значение, найденное между каждым вхождением 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, что позволяет нам выполнять код в правой части Оператор. Ну наконец то,регулярное выражение будет сопоставлять одну или несколько цифр(\d+)между YRи PR, захватывая цифры как $1, а затем замена будет печатать YR, захваченное число плюс 32 и PR.

3
18.03.2021, 23:13

Использование любого awk в любой оболочке на каждом компьютере UNIX:

$ 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,
1
18.03.2021, 23:13

Команда

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,
0
18.03.2021, 23:13

Теги

Похожие вопросы