
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
Wenn eine/eindeutige Übereinstimmung vorliegt, müssen die Werte von $PID, $SANDBOX_NAME, $SCRIPT_NAME in eine Datei geschrieben werden.
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.csv
aus der Frage, abs
ersetzt durch abc
und 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.csv
aus 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 join
Operation 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 sed
am Ende ersetzt dann das @
durch Kommas.