如何为 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
能否请您尝试以下操作,在名为 fields
的 awk
变量中,您可以提及您想要更改的所有字段,其余的将在解决方案中得到注意(如 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.
我有一个用例,我需要用一些字符串替换某些字段的值。字段值必须在运行时从配置文件中获取,并且应该用 '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
能否请您尝试以下操作,在名为 fields
的 awk
变量中,您可以提及您想要更改的所有字段,其余的将在解决方案中得到注意(如 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.