используйте команду linux join для обновления полей в текстовом файле, если значение существует - PullRequest
0 голосов
/ 06 марта 2019

У меня есть два очень больших текстовых файла, в которых file2 содержит «обновления и новые элементы» Например: file1:

itemA,ABC,123
itemB,,456
itemC,XYZ,789

file2:

itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX

Я хочу, чтобы мой окончательный результат был:

itemA,ABC,123
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX

Так что это добавит любые новые строки, но заменит информацию для любых существующих строк. Можно ли это сделать с помощью coreutils (join, paste, merge и т. Д.)? Или мне лучше загрузить его в базу данных, сделать INSERT / ON DUPLICATE KEY UPDATE и выгрузить его?

1 Ответ

0 голосов
/ 06 марта 2019

Я предполагаю, что 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
...