
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, а выходные условия будут следующими:
Если есть одно/уникальное совпадение, то необходимо записать значения $PID,$SANDBOX_NAME,$SCRIPT_NAME в файл.
Если совпадений нет, то установите значение $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
в конце заменяется @
запятыми.