使用另一个文件中的密钥递归查找并替换一个文件的内容

使用另一个文件中的密钥递归查找并替换一个文件的内容

我需要使用一个文件作为输入来查找并替换另一个文件。以下命令执行此操作,但仅适用于每行的第一列。我需要每列都发生这种情况。

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{$1=a[$1];print}' OFS=',' file1 file2 > fileout

这两个文件看起来像这样

文件1(密钥):

0,name0
1,name1
2,name2
3,name3
4,name4

文件2:

23,45,0
41,1,2,4
4,5,22,100
10,20,31,51,1
33,3
16,111,3

输出应该是:

23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3

答案1

这有效:

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{for (i=1;i<=NF;i++) $i=a[$i];print}' OFS=',' file1 file2 > fileout

谢谢

答案2

我认为上面不会起作用。我的系统上的结果:

,,name0
,name1,name2,name4
name4,,,
,,,,name1
,name3
,,name3

尝试一下

awk -F',' 'NR==FNR{a[$1]=$2; next} {for (i=1;i<=NF;i++) if (a[$i]) $i=a[$i]} 1' OFS=',' file1 file2
23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3

答案3

也可以通过以下方式完成sed

sed -f <(sed 's|,|$/,|;s|^|s/,|;s|$|/|' f1) f2

正如 Kusalananda 所指出的,该解决方案使用进程替换,并非所有常见 shell 都支持。然而,还有其他方法可以达到相同的效果。

这是如何运作的?基本思想是将文件转换f1为一个sed程序,该程序将转换文件f2。括号中的命令sed将文件的每一行转换f1为一个s///命令。

相关内容