awksub用一个捕获组替换成

为此,我正在编写一个 awk oneliner:

文件 1:

1   apple
2   orange
4   pear

文件2:

1/4/2/1

所需的输出: apple/pear/orange/apple

附录:缺失的数字最好保持不变 1/4/2/3 = apple/pear/orange/3 以防止信息丢失。

方法:

  1. 为 file1 构建关联数组 key[$1] = $2
  2. 捕获斜杠之间的所有字符并通过匹配关联数组的键来替换它们,例如 key[4] = pear

尝试:

gawk 'NR==FNR { key[$1] = $2 }; NR>FNR { r = gensub(/(w+)/, "key[1]" , "g"); print r}' file1.txt file2.txt

#gawk because need to use w+ regex
#gensub used because need to use a capturing group

不幸的是,结果是 1/4/2/1

键[1]/键[4]/键[2]/键[1]

有什么建议?谢谢你。

回答

你可以使用这个awk

awk -v OFS='/' 'NR==FNR {key[$1] = $2; next}
{for (i=1; i<=NF; ++i) if ($i in key) $i = key[$i]} 1' file1 FS='/' file2

apple/pear/orange/apple

请注意,如果数组中file2不存在数字,key那么它将使这些字段为空。

file1 FS='/' file2将保留默认字段分隔符,file1/在阅读时将用作字段分隔符file2


回答

编辑:如果您在 file2 中没有匹配的文件,并且您想保留原始值,请尝试以下操作:

awk '
FNR==NR{
  arr[$1]=$2
  next
}
{
  val=""
  for(i=1;i<=NF;i++){
    val=(val=="" ? "" : val FS) (($i in arr)?arr[$i]:$i)
  }
  print val
}
' file1 FS="/" file2


使用您显示的样本,请尝试以下操作。

awk '
FNR==NR{
  arr[$1]=$2
  next
}
{
  val=""
  for(i=1;i<=NF;i++){
    val = (val=="" ? "" : val FS) arr[$i]
  }
  print val
}
' file1 FS="/" file2

说明:首先读取 Input_file1 并创建数组 arr,其中第一个字段的索引和第二个字段的值然后将字段分隔符设置为/并遍历每个字段 os file2 并将其值保存在 val 中;最后为每一行打印它。


以上是awksub用一个捕获组替换成的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>