シェルスクリプトは2つの列に基づいて2つのファイルをリンクし、一致するものがある場合はいくつかのフィールドを書き込みます。

シェルスクリプトは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/@/,/'

これら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

これは、最初のカンマを(少なくとも最初のフィールドにはないデータにない文字)に置き換え、2番目の区切りフィールド(カンマで区切られた最後の2つのフィールド)の各入力ファイルをソートして結果joinを計算します。 2番目のフィールドと2番目のファイルの2番目のフィールドを出力します。また、最初のファイルに一致しない項目を追加し、空のフィールドを文字列に置き換えます。@@NULL

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

おすすめ記事