如何为 gsub 使用动态字段值?

How to use dynamic field value for gsub?

我有一个用例,我需要用一些字符串替换某些字段的值。字段值必须在运行时从配置文件中获取,并且应该用 '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

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

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

能否请您尝试以下操作,在名为 fieldsawk 变量中,您可以提及您想要更改的所有字段,其余的将在解决方案中得到注意(如 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.