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