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/@/,/'
有了这两个文件
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替换@
为逗号。