代码之家  ›  专栏  ›  技术社区  ›  Saffik

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

  •  1
  • Saffik  · 技术社区  · 7 年前

    我在一个名为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

    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&
    

    应替换该文件并将其应用于tempfile datanew.txt,而不仅仅是在屏幕上打印。

    &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 回复  |  直到 7 年前
        1
  •  2
  •   Weijun Zhou    7 年前

    使用 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