Замените значения в текстовом файле для одного пакета на AWK и увеличьте последующее значение из последнего - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующее в текстовом файле с именем data.txt

&st=1000&type=rec&uniId=5800000000&acceptCode=1000&drainNel=supp&
&st=1100&type=rec&uniId=5800000000&acceptCode=1000&drainNel=supp&
&st=4100&type=rec&uniId=6500000000&acceptCode=4100&drainNel=ured&
&st=4200&type=rec&uniId=6500000000&acceptCode=4100&drainNel=iris&
&st=4300&type=rec&uniId=6500000000&acceptCode=4100&drainNel=iris&
&st=8300&type=rec&uniId=7700000000&acceptCode=8300&drainNel=teef&

1) Сценарий примет входной аргумент в виде числа, например: 979035210000000098

2) Я хочу заменить все текстовое значение для uniId=xxxxxxxxxx на указанное длинное число, переданное в аргументе в скрипт. ВАЖНО: если uniID одинаков, он заменит одинаковое значение для всех них.(В этом случае первые две строки одинаковы, затем следующие три строки одинаковы, затем последняя одна и та же) Для следующего пакета он заменит + приращение (5 000 000 000) от последней

Игнорироватьвсе остальные поля, и они не должны быть изменены.

Так по сути дела это:

./script.sh 979035210000000098

.. все еще в замешательстве?Ну, окончательный результат может быть следующим:

&st=1000&type=rec&uniId=979035210000000098&acceptCode=1000&drainNel=supp&
&st=1100&type=rec&uniId=979035210000000098&acceptCode=1000&drainNel=supp&
&st=4100&type=rec&uniId=979035215000000098&acceptCode=4100&drainNel=ured&
&st=4200&type=rec&uniId=979035215000000098&acceptCode=4100&drainNel=iris&
&st=4300&type=rec&uniId=979035215000000098&acceptCode=4100&drainNel=iris&
&st=8300&type=rec&uniId=979035220000000098&acceptCode=8300&drainNel=teef&

Это ^ следует ЗАМЕНИТЬ и применить к временному файлу datanew.txt, а не просто печатать на экране.

Существует сценарий AWK, который выполняет заменудля &st=xxx и для &acceptCode=xxx, но, возможно, я смогу использовать повторно, но не смогу заставить его работать так, как я ожидаю?

# $./script.sh [STARTCOUNT] < data.txt > datanew.txt
# $ mv -f datanew.txt data.txt
awk  -F '&' -v "cnt=${1:-10000}" -v 'OFS=&' \
   'NR == 1 { ac = cnt; uni = $4; }
    NR > 1 && $4 == uni { cnt += 100 }
    $4 != uni { cnt += 5000000000; ac = cnt; uni = $4 }
    { $2 = "st=" cnt; $5 = "acceptCode=" ac; print }'

1 Ответ

0 голосов
/ 22 ноября 2018

Используя gnu awk, вы можете использовать это:

awk -M -i inplace -v num=979035210000000098 'BEGIN{FS=OFS="&"}
!seen[$4]++{p = (NR>1 ? p+5000000000 : num)} {$4="uniId=" p} 1' file

&st=1000&type=rec&uniId=979035210000000098&acceptCode=1000&drainNel=supp&
&st=1100&type=rec&uniId=979035210000000098&acceptCode=1000&drainNel=supp&
&st=4100&type=rec&uniId=979035215000000098&acceptCode=4100&drainNel=ured&
&st=4200&type=rec&uniId=979035215000000098&acceptCode=4100&drainNel=iris&
&st=4300&type=rec&uniId=979035215000000098&acceptCode=4100&drainNel=iris&
&st=8300&type=rec&uniId=979035220000000098&acceptCode=8300&drainNel=teef&

Опции -M или --bignum заставляют использовать арифметику произвольной точности для чисел в gnu awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...