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