
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
Si hay una coincidencia única, entonces es necesario escribir los valores de $PID,$SANDBOX_NAME,$SCRIPT_NAME en un archivo.
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.csv
de la pregunta, abs
reemplazado por abc
y 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.csv
de 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 join
sobre 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 sed
al final luego reemplaza @
con comas.