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

2

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

Eu quero participar de 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 / precisa 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 para NULL e grave o conteúdo em um arquivo no formato a seguir como $ PID = NULL, $ SANDBOX_NAME, $ SCRIPT_NAME

A partir de agora, meu código parece

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

Por favor, dê uma olhada e sugira-me com suas idéias para que eu possa completar meu pedaço de código. Espero ansiosamente por suas sugestões e idéias brilhantes. Aprecie sua ajuda e suporte.

    
por Binay Mishra 30.10.2015 / 16:45

1 resposta

0

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, com 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 na classificação de cada arquivo de entrada no segundo @ -delimited campo (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. 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.

    
por 04.09.2017 / 12:02