처리해야 하는 두 가지 값 목록(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
$