【问题标题】:How to use dynamic field value for gsub?如何为 gsub 使用动态字段值?
【发布时间】:2020-05-26 05:21:37
【问题描述】:

我有一个用例,我需要用一些字符串替换某些字段的值。该字段值必须在运行时从配置文件中获取,并且应该将该字段中的每个字符替换为“X”。

输入:

Hello~|*World Good~|*Bye

输出:

Hello~|*XXXXX Good~|*XXX

为此,我使用以下命令

awk -F "~\|\*" -v OFS="~|*" '{gsub(/[a-zA-Z0-9]/,"X",$ordinal_position)}1' $temp_directory/$file_basename

这里我想使用 ordinal_position 变量来传递字段编号。

我已经尝试过下面的命令,但它不起作用。

awk -F '~\|\*' -v var="$"25 -v OFS='~|*' '{gsub(/[a-zA-Z0-9]/,"X",var)}1' $temp_directory/$file_basename

【问题讨论】:

    标签: shell unix awk gsub


    【解决方案1】:

    在 awk 程序中将字段编号作为整数传递,并在变量名称前加上 $(或括在 $() 中以提高可读性)以引用该字段。喜欢:

    awk -v <b>var=25</b> '{ gsub(/regex/, "replacement", <b>$var</b>) } 1' file

    【讨论】:

      【解决方案2】:

      您能否尝试以下操作,在 awk 变量名为 fields 中,您可以提及您想要更改的所有字段,其余字段将在解决方案中得到处理(如 OP 在示例中显示了第二和第三字段所以把2,3放在这里OP可以根据需要改变值)。使用 GNU awk 中的示例编写和测试。

      awk -v fields="2,3" '
      BEGIN{
        FS=OFS="|"
        num=split(fields,fieldIn,",")
        for(i=1;i<=num;i++){
        arrayfieldsIn[fieldIn[i]]
        }
      }
      function fieldChange(field_number){
        delete array
        num=split($field_number,array," ")
        gsub(/[a-zA-Z0-9]/,"X",array[1])
        for(i=2;i<=num;i++){
          val=val array[i]
        }
        $field_number=array[1] " " val
        val=""
      }
      {
        for(j=1;j<=NF;j++){
          if(j in arrayfieldsIn){
            fieldChange(j)
          }
        }
      }
      1
      '  Input_file
      

      说明:为上述添加详细说明。

      awk -v fields="2,3" '                     ##Starting awk program from here and setting value of variable fields with value of 2,3.
      BEGIN{                                    ##Starting BEGIN section of this program here.
        FS=OFS="|"                              ##Setting FS and OFS values as | here.
        num=split(fields,fieldIn,",")           ##Splitting fields variable into array fieldIn and delimited with comma here.
        for(i=1;i<=num;i++){                    ##Starting for loop from 1 to till value of num here.
        arrayfieldsIn[fieldIn[i]]               ##Creating array arrayfieldsIn with index fieldIn here.
        }
      }
      function fieldChange(field_number){       ##Creating function here for changing field values.
        delete array                            ##Deleting array here.
        num=split($field_number,array," ")      ##Splitting field_number into array with delimiter as space here.
        gsub(/[a-zA-Z0-9]/,"X",array[1])        ##Globally substituting alphabets and digits with X in array[1] here.
        for(i=2;i<=num;i++){                    ##Running for loop from 2 to till num here.
          val=val array[i]                      ##Creating variable val which has array value here.
        }
        $field_number=array[1] " " val          ##Setting field_number to array value and val here.
        val=""                                  ##Nullify val here.
      }
      {
        for(j=1;j<=NF;j++){                     ##Running loop till value of NF here.
          if(j in arrayfieldsIn){               ##Checking if j is present in array then do following.
            fieldChange(j)                      ##Calling fieldChange with variable j here.
          }
        }
      }
      1                                         ##1 will print line here.
      ' Input_file                              ##Mentioning Input_file name here.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 2016-05-19
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 2014-07-09
        • 2018-06-19
        相关资源
        最近更新 更多