用AWK替换一个批次的文本文件中的值,并从最后一个批次增加后续值



我在一个名为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相同,它将为所有uniID替换相同的值。(在这种情况下,前两行相同,然后接下来的三行相同,最后一行相同(对于下一批,它将替换最后一行的+增量(5000000000(

忽略所有其他字段,它们不应被修改。

所以本质上是这样做的:

./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 }'

使用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中的数字进行任意精度运算。

最新更新