shell script para juntar 2 arquivos com base em 2 colunas e se for encontrada uma correspondência, escreva alguns campos

shell script para juntar 2 arquivos com base em 2 colunas e se for encontrada uma correspondência, escreva alguns campos

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

  1. Se houver uma correspondência única, será necessário gravar os valores de $PID,$SANDBOX_NAME,$SCRIPT_NAME em um arquivo.

  2. 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.csvda pergunta, abssubstituído por abce 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.csvda 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 joinopera 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 sedno final substitui o @por vírgulas.

informação relacionada