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를 @
쉼표로 바꿉니다.