Вы можете сделать это с помощью следующего скрипта:
BEGIN { FS="," }
NR==FNR {
lookup[$7] = $0
next
}
{
if (lookup[$7] != "") {
$0 = lookup[$7]
}
print
}
END {
print ""
print "Lookup table used was:"
for (i in lookup) {
print " Key '"i"', Value '"lookup[i]"'"
}
}
В разделе BEGIN
просто устанавливается разделитель полей на ,
, поэтому отдельные поля могут быть легко обработаны.
Переменные NR
и FNR
- это, соответственно, номер строки входного потока full (все файлы) и номер строки current файла в входной поток. Когда вы обрабатываете первый (или единственный) файл, они будут равны, поэтому мы используем это как средство для простого хранения строк из первого файла, введенных в поле седьмое.
Когда NR
и FNR
не равны, это потому, что вы запустили второй файл, и именно здесь мы хотим заменить строки, если их ключ существует в первом файле.
Это делается путем простой проверки, существует ли строка в таблице поиска с нужным ключом, и, если это так, заменой текущей строки строкой таблицы поиска. Затем мы печатаем (оригинальную или замененную) строку.
Раздел END
предназначен только для целей отладки, он выводит таблицу поиска, которая была создана и использована, и вы можете удалить ее, как только вы убедитесь, что скрипт работает должным образом.
Вы увидите вывод в следующем транскрипте, надеясь, что он работает правильно:
pax$ cat file1
2,1,1,1,Test1,1540584051,52
6,5,1,1,Test2,1540579206,54
3,3,0,0,Test3,1540591243,36
pax$ cat file2
2,1,0,2,Test1,1540584051,52
6,5,0,2,Test2,1540579206,54
pax$ awk -f sudarshan.awk file1 file2
2,1,1,1,Test1,1540584051,52
6,5,1,1,Test2,1540579206,54
Lookup table used was:
Key '36', Value '3,3,0,0,Test3,1540591243,36'
Key '52', Value '2,1,1,1,Test1,1540584051,52'
Key '54', Value '6,5,1,1,Test2,1540579206,54'
Если вам нужен как можно более короткий однострочник для использования в вашем скрипте, просто используйте:
awk -F, 'NR==FNR{x[$7]=$0;next}{if(x[$7]!=""){$0=x[$7]};print}' file1 file2
хотя я сам предпочитаю читаемую версию.