script de shell para unir 2 archivos en base a 2 columnas y, si se encuentra una coincidencia, escriba algunos campos

script de shell para unir 2 archivos en base a 2 columnas y, si se encuentra una coincidencia, escriba algunos 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

Quiero unirme a abc.csv y xyz.csv según los campos $SANDBOX_NAME y $SCRIPT_NAME y las condiciones de salida son las siguientes

  1. Si hay una coincidencia única, entonces es necesario escribir los valores de $PID,$SANDBOX_NAME,$SCRIPT_NAME en un archivo.

  2. Si no hay coincidencias, complete el valor de $PID a NULL y escriba el contenido en un archivo en el siguiente formato como $PID=NULL,$SANDBOX_NAME,$SCRIPT_NAME

A partir de ahora mi código se ve así

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

¿Podría echar un vistazo y sugerirme sus ideas para que pueda completar mi código? Esperamos sus brillantes sugerencias e ideas. Agradezco su ayuda y apoyo.

Respuesta1

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/@/,/'

Con los dos archivos

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.csvde la pregunta, absreemplazado por abcy agregada una línea que no coincide) y

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.csvde la pregunta), esto produce

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

Opera joinsobre el resultado de reemplazar la primera coma por @(cualquier carácter que no esté presente en los datos, al menos no en el primer campo) y ordenar cada archivo de entrada en el segundo @campo delimitado (que son los dos últimos campos separados por comas). . Genera el primer campo del primer archivo y el segundo campo del segundo archivo. También agrega las entradas no coincidentes del primer archivo y reemplaza los campos vacíos con la cadena NULL.

El sedal final luego reemplaza @con comas.

información relacionada