【问题标题】:Replace values in text file for one batch with AWK and increment subsequent value from last one用 AWK 替换一批文本文件中的值,并从最后一个值递增后续值
【发布时间】: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 而变化)

标签: bash shell awk replace


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 2023-03-18
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多