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/@/,/'
これら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を@
コンマに置き換えます。