shell 腳本根據 2 列連接 2 個文件,如果找到匹配項,則寫入一些字段

shell 腳本根據 2 列連接 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

我想根據欄位 $SANDBOX_NAME 和 $SCRIPT_NAME 加入 abc.csv 和 xyz.csv ,輸出條件如下

  1. 如果存在一個/唯一匹配,則需要將 $PID、$SANDBOX_NAME、$SCRIPT_NAME 的值寫入檔案。

  2. 如果沒有符合項,則將 $PID 的值填入 NULL 並將內容寫入下列格式的檔案中:$PID=NULL,$SANDBOX_NAME,$SCRIPT_NAME

截至目前我的程式碼看起來像

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

您能否看一下並提出您的想法,以便我完成我的程式碼。感謝您的幫助與支持。

答案1

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

有了這兩份文件

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從問題中,abs替換為abc並添加不匹配的行)並且

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來自問題),這會產生

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

該操作對將第一個逗號替換為(資料中不存在的任何字符,至少不在第一個字段中)並對第二個分隔字段(最後兩個逗號分隔字段)上的每個輸入文件進行排序的join結果進行操作。它輸出第一個文件中的第一個欄位和第二個文件中的第二個欄位。它還會添加第一個文件中不匹配的條目,並用字串替換空字段。@@NULL

sed然後末尾的the替換@為逗號。

相關內容