
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 つだけある場合は、$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
は、最初のコンマを (データに存在しない文字、少なくとも最初のフィールドに存在しない文字)join
に置き換え、各入力ファイルを 2 番目の - 区切りフィールド (最後の 2 つのコンマ区切りフィールド) でソートした結果に基づいて動作します。最初のファイルから最初のフィールドを出力し、2 番目のファイルから 2 番目のフィールドを出力します。また、最初のファイルから一致しないエントリを追加し、空のフィールドを文字列 に置き換えます。@
@
NULL
sed
末尾の は をコンマ@
に置き換えます。