보조 목록에 항목이 있는지 여부에 따라 목록을 분할하는 Bash 스크립트가 있습니까?

보조 목록에 항목이 있는지 여부에 따라 목록을 분할하는 Bash 스크립트가 있습니까?

처리해야 하는 두 가지 값 목록(IDlist1과 IDlist2)이 있습니다. 내가 하려는 것은 IDlist1을 반복하여 IDList2에 각 행 항목이 있는지 확인한 다음 일치 여부에 따라 값을 분리하는 것입니다. 이를 최대한 우아하게 수행하는 데 도움이 되는 특정 연산자나 스크립트가 있습니까?

예시ID목록1
TZ001
TZ002
TZ004
TZ006
TZ007
TZ009
TZ011
ID 목록 2
TZ001
TZ004
TZ006
TZ007
출력 1(IDlist1이 IDlist2에 존재함)
TZ001
TZ004
TZ006
TZ007
출력 2(IDlist1 및 IDlist2가 일치하지 않음/존재하지 않음)
TZ002
TZ009
TZ011

답변1

이상한 해결책 :

awk 스크립트 파일 checklists.awk:

#! /usr/bin/awk -f

NR == FNR {
    # Recording first input script file (for you, IDList2)
    hash[$1] = $0
    next
}
$1 in hash {
    # if second file key is found in first file 
    print hash[$1]
    next
}
{
    # if second file key is not found in first file 
    print $1 > OUTPUT_FILENAME_NOT_FOUND
}

스크립트 실행 모드 변경:

chmod 755 checklists.awk

awk 스크립트는 다음과 같이 실행됩니다.

./checklists.awk -v OUTPUT_FILENAME_NOT_FOUND="./Output2"  IDlist2 IDlist1 > ./Output1

경고, "IDlist2" 파일(참조)은 Awk 스크립트의 첫 번째 데이터 파일입니다.

답변2

표준 join명령이 귀하의 요구 사항을 충족하는 것 같습니다.

출력 1(IDlist1이 IDlist2에 존재함)

$ join idlist1 idlist2
TZ001
TZ004
TZ006
TZ007
$

출력 2(IDlist1 및 IDlist2가 일치하지 않음/존재하지 않음)

$ join -v 1 idlist1 idlist2
TZ002
TZ009
TZ011
$

관련 정보