Я предполагаю, что file2 меньше, чем file1, так как это «новые или обновленные» записи.Я также предполагаю, что он достаточно мал, чтобы удобно помещаться в памяти.
С помощью awk: здесь хранится файл2, в котором поле 1 является уникальным идентификатором.
- Если поле 1 появляется как в файле1, так и в файле2, то печатается запись файла2.
- Если поле 1 появляется только в файле1, эта запись печатается.
- После обработки файла 1 печатаются все записи из файла2, которые не отображаются в файле1.
awk -F, '
NR == FNR {f2[$1] = $0; next}
$1 in f2 {print f2[$1]; delete f2[$1]; next}
1
END {for (key in f2) print f2[key]}
' file2 file1
output
itemA,ABC,123
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX
Это просто происходит сортировка, вы можете передать вывод в sort
, если это важно для вас.
Вот версияс join
и awk: join требует сортировки входных файлов
$ join -t, -a1 -a2 <(sort file1) <(sort file2) | awk -F, -v OFS=, '{print $1, $(NF-1), $NF}'
itemA,ABC,123
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX