Рекурсивно найти и заменить содержимое одного файла, используя ключ из другого файла

Мне нужно использовать один файл в качестве входных данных, чтобы найти и заменить в другом файле. Следующая команда делает это, но только для первого столбца для каждой строки. Мне нужно, чтобы это произошло для каждого столбца.

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

Два файла выглядят так

file1 (ключ):

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

file2:

 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 

Это сработало:

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

Спасибо

Я не думаю, что выше будет работать. Результат в моей системе:

 ,,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 

Это также можно сделать с помощью sed :

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

Как указывает Кусалананда, в этом решении используется замена процесса, которую поддерживают не все распространенные оболочки. Однако есть и другие способы достижения того же эффекта.

Как это работает? Основная идея заключается в том, чтобы преобразовать файл f1 в программу sed которая, в свою очередь, преобразует файл f2 . Команда sed в скобках преобразует каждую строку файла f1 в команду s/// .