Как использовать значение поля Dynami c для gsub? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть случай, когда мне нужно заменить значения определенных полей некоторой строкой. Значение поля должно быть взято из файла конфигурации во время выполнения и должно заменить каждый символ в этом поле на '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

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Не могли бы вы попробовать следующее, здесь, в awk переменной с именем fields, вы можете указать все поля, которые вы хотите изменить, и остальное будет позаботиться в решении (например, OP показал 2-е и 3-е поля в образцах поэтому вставив здесь 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.
1 голос
/ 26 мая 2020

Передайте номер поля как целое число и поставьте перед именем переменной $ (или заключите в $() для лучшей читаемости) в программе awk для ссылки на это поле. Как:

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