
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
Quero juntar abc.csv e xyz.csv com base nos campos $SANDBOX_NAME e $SCRIPT_NAME e as condições de saída são as seguintes
Se houver uma correspondência única, será necessário gravar os valores de $PID,$SANDBOX_NAME,$SCRIPT_NAME em um arquivo.
Se não houver correspondências, preencha o valor de $PID como NULL e grave o conteúdo em um arquivo no seguinte formato como $PID=NULL,$SANDBOX_NAME,$SCRIPT_NAME
A partir de agora meu código se parece com
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
Você pode dar uma olhada e me sugerir suas ideias para que eu possa completar meu código. Aguardo suas sugestões e ideias brilhantes. Agradeço sua ajuda e apoio.
Responder1
Usando 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/@/,/'
Com os dois arquivos
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
da pergunta, abs
substituído por abc
e uma linha não correspondente adicionada) e
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
da pergunta), isso produz
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
O join
opera no resultado da substituição da primeira vírgula por @
(qualquer caractere não presente nos dados, pelo menos não no primeiro campo) e classificação de cada arquivo de entrada no segundo @
campo delimitado (que são os dois últimos campos separados por vírgula) . Ele gera o primeiro campo do primeiro arquivo e o segundo campo do segundo arquivo. Ele também adiciona as entradas não correspondentes do primeiro arquivo e substitui os campos vazios pela string NULL
.
O sed
no final substitui o @
por vírgulas.