Shell-Skript zum Verbinden von 2 Dateien auf Basis von 2 Spalten und wenn eine Übereinstimmung gefunden wird, dann schreiben Sie einige Felder

Shell-Skript zum Verbinden von 2 Dateien auf Basis von 2 Spalten und wenn eine Übereinstimmung gefunden wird, dann schreiben Sie einige Felder

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

Ich möchte abc.csv und xyz.csv auf Basis der Felder $SANDBOX_NAME und $SCRIPT_NAME zusammenführen und die Ausgabebedingung ist wie folgt

  1. Wenn eine/eindeutige Übereinstimmung vorliegt, müssen die Werte von $PID, $SANDBOX_NAME, $SCRIPT_NAME in eine Datei geschrieben werden.

  2. Wenn es keine Übereinstimmungen gibt, setzen Sie den Wert von $PID auf NULL und schreiben Sie den Inhalt in eine Datei im folgenden Format: $PID=NULL,$SANDBOX_NAME,$SCRIPT_NAME

Im Moment sieht mein Code so aus

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

Können Sie bitte einen Blick darauf werfen und mir Ihre Ideen mitteilen, damit ich meinen Codeabschnitt fertigstellen kann? Ich freue mich auf Ihre brillanten Vorschläge und Ideen. Ich weiß Ihre Hilfe und Unterstützung zu schätzen.

Antwort1

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

Mit den beiden Dateien

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.csvaus der Frage, absersetzt durch abcund eine nicht übereinstimmende Zeile hinzugefügt) und

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.csvaus der Frage), dies ergibt

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

Die joinOperation basiert auf dem Ergebnis des Ersetzens des ersten Kommas durch @(jedes beliebige Zeichen, das nicht in den Daten vorhanden ist, zumindest nicht im ersten Feld) und sortiert jede Eingabedatei nach dem zweiten durch Kommas @getrennten Feld (das sind die letzten beiden durch Kommas getrennten Felder). Sie gibt das erste Feld aus der ersten Datei und das zweite Feld aus der zweiten Datei aus. Sie fügt außerdem die nicht übereinstimmenden Einträge aus der ersten Datei hinzu und ersetzt leere Felder durch die Zeichenfolge NULL.

Das sedam Ende ersetzt dann das @durch Kommas.

verwandte Informationen