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 以防止信息丢失。
方法:
- 为 file1 构建关联数组 key[$1] = $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 中;最后为每一行打印它。