обновите значения в FILE_1, используя значения для сопоставления ключа из FILE_2 с помощью bash — возможно, awk

#awk

#awk

Вопрос:

У меня следующая ситуация: FILE_1, который содержит ddl, и это может быть так:

 column_A  varchar(50)
column_B  int
column_C  varchar (100)
  

и FILE_2, который содержит то, что изменено в FILE_1, например

 column_B  varchar(50)
  

Я хотел бы обновить FILE_1, изменив «column_B int» на «column_B varchar (50)»
и, конечно, мне также понадобятся все остальные строки без изменений

используя awk, мне удалось идентифицировать измененную строку

 awk 'NR==FNR{a[$1]  ;next} ($1 in a)' file_1 file_2
  

но я не знаю, как я могу записать это в file_1

как я мог этого добиться?

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное с показанными образцами в GNU awk .

 awk 'FNR==NR{a[$1]=$2;next} ($1 in a){$2=a[$1]} 1' file_2 file_1
  

В случае, если приведенная выше команда печатает правильные результаты для вас на терминале, вы можете использовать следующее, которое сохранит вывод в самом Input_file.

 awk 'NR==FNR{a[$1]  ;next} ($1 in a)' file_1 file_2 > temp amp;amp; mv temp file_1
  

Объяснение: Добавляю подробное объяснение выше.

 awk '               ##Starting awk program from here.
FNR==NR{            ##Checking condition if FNR==NR which will be true when first Input_file named file_2 is being read.
  a[$1]=$2          ##Creating array a with index of $1 and its value is $2 from current line.
  next              ##next will skip all further statements from here.
}
($1 in a){          ##Checking condition if first field is present in array a then do following.
  $2=a[$1]          ##Assigning array a value with index of first field to 2nd field.
}
1                   ##1 will print current line here.
' file_2 file_1     ##Mentioning Input_file names here.