2つの列に基づいて2つのファイルを結合し、一致が見つかった場合はいくつかのフィールドを書き込むシェルスクリプト

2つの列に基づいて2つのファイルを結合し、一致が見つかった場合はいくつかのフィールドを書き込むシェルスクリプト

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

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. 一致するものが 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/@/,/'

2つのファイルで

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に置き換え、各入力ファイルを 2 番目の - 区切りフィールド (最後の 2 つのコンマ区切りフィールド) でソートした結果に基づいて動作します。最初のファイルから最初のフィールドを出力し、2 番目のファイルから 2 番目のフィールドを出力します。また、最初のファイルから一致しないエントリを追加し、空のフィールドを文字列 に置き換えます。@@NULL

sed末尾の は をコンマ@に置き換えます。

関連情報