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

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

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 

3 Solutions collect form web for “Рекурсивно найти и заменить содержимое одного файла, используя ключ из другого файла”

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

 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/// .

  • Как получить последние три последние даты файла журнала?
  • Как переформатировать блоки зоны named.conf в одну строку?
  • Извлечь несколько вхождений в одну строку строки между двумя разделителями
  • Соответствует, если столбец частично соответствует другому столбцу
  • Добавление дополнительной информации в строку
  • sed заменяет соответствующую строку, которая не начинается с #
  • Использование awk для сравнения файлов и объединения вывода из обоих файлов?
  • печатать строки с уникальными указанными полями
  • awk: разделить столбец, распечатать левую часть разделителя и вставить в середине csv
  • sed с несколькими командами, могу ли я использовать флаг w (write)?
  • Как выполнить две команды grep для одного файла?
  • Linux и Unix - лучшая ОС в мире.