У меня есть следующее в текстовом файле с именем 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 }'