скрипт оболочки для объединения 2 файлов на основе 2 столбцов и, если совпадение найдено, записи некоторых полей

скрипт оболочки для объединения 2 файлов на основе 2 столбцов и, если совпадение найдено, записи некоторых полей

abc.csv

TBL_NAME,SANDBOX_NAME,SCRIPT_NAME
ccti_prod_attdnl_ext,abs_ext,101_ext_table.m_diag.pset
ccti_prod_attdnl_ext,abs_ids,101_ext_table.m_diag.pset

xyz.csv

PID,SANDBOX_NAME,SCRIPT_NAME
11065,abc_ext,101_ext_table.m_diag.pset
11066,abc_ext,101_ext_table.m_diag.pset
11067,abc_ids,101_ext_table.m_diag.pset

Я хочу объединить abc.csv и xyz.csv на основе полей $SANDBOX_NAME и $SCRIPT_NAME, а выходные условия будут следующими:

  1. Если есть одно/уникальное совпадение, то необходимо записать значения $PID,$SANDBOX_NAME,$SCRIPT_NAME в файл.

  2. Если совпадений нет, то установите значение $PID равным NULL и запишите содержимое в файл в следующем формате: $PID=NULL,$SANDBOX_NAME,$SCRIPT_NAME

На данный момент мой код выглядит так

awk -F',' 'NR==FNR{c[$2$3]++;next};c[$2$3] > 0' abc.csv xyz.csv | 
while read line
do
    PID=$(echo $line | cut -f 1 -d",");
    SAND_NAME=$(echo $line | cut -f 2 -d",");
    OBJECT_NAME=$(echo $line | cut -f 3 -d",");
    for ( $line >  
         echo "$SAND_NAME,$OBJECT_NAME,$PID" > test.csv
    done

Можете ли вы, пожалуйста, взглянуть и предложить мне свои идеи, чтобы я мог завершить свой кусок кода. Жду ваших блестящих предложений и идей. Ценю вашу помощь и поддержку.

решение1

С использованием bash:

join -t @ -1 2 -2 2 -o2.1,1.2 -a 1 -e NULL \
    <( sort -t @ -k2 <( sed 's/,/@/' abc.csv ) ) \
    <( sort -t @ -k2 <( sed 's/,/@/' xyz.csv ) ) | sed 's/@/,/'

С двумя файлами

TBL_NAME,SANDBOX_NAME,SCRIPT_NAME
ccti_prod_attdnl_ext,abc_ext,101_ext_table.m_diag.pset
ccti_prod_attdnl_ext,abc_ids,101_ext_table.m_diag.pset
ccti_prod_attdnl_ext,xxx_ids,101_ext_table.m_diag.pset

( abc.csvиз вопроса, absзаменено на abcи добавлена ​​несоответствующая строка) и

PID,SANDBOX_NAME,SCRIPT_NAME
11065,abc_ext,101_ext_table.m_diag.pset
11066,abc_ext,101_ext_table.m_diag.pset
11067,abc_ids,101_ext_table.m_diag.pset

( xyz.csvиз вопроса), это производит

PID,SANDBOX_NAME,SCRIPT_NAME
11065,abc_ext,101_ext_table.m_diag.pset
11066,abc_ext,101_ext_table.m_diag.pset
11067,abc_ids,101_ext_table.m_diag.pset
NULL,xxx_ids,101_ext_table.m_diag.pset

Работает joinс результатом замены первой запятой на @(любой символ, отсутствующий в данных, по крайней мере, не в первом поле) и сортирует каждый входной файл по второму @полю, разделенному запятыми (которое является последними двумя полями, разделенными запятыми). Он выводит первое поле из первого файла и второе поле из второго файла. Он также добавляет несовпадающие записи из первого файла и заменяет пустые поля строкой NULL.

Затем sedв конце заменяется @запятыми.

Связанный контент