
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 ,輸出條件如下
如果存在一個/唯一匹配,則需要將 $PID、$SANDBOX_NAME、$SCRIPT_NAME 的值寫入檔案。
如果沒有符合項,則將 $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替換@
為逗號。