쉘 스크립트는 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/@/,/'

이 두 파일로

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

관련 정보