【发布时间】:2019-04-25 06:08:14
【问题描述】:
我在名为 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&
这个 ^ 应该被替换并应用于 tempfile 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 }'
【问题讨论】:
-
所以每次
acceptCode改变你想增加uniId? -
每次 uniId 更改...忽略所有字段。 (但是,是的,我想我们甚至可以查看 acceptCode 的变化,因为它也会随着 uniId 而变化)