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替换@为逗号。

相关内容