我有两个需要处理的值列表:IDlist1 和 IDlist2。我尝试执行的操作是循环遍历 IDlist1 并检查 IDList2 中是否存在每个行条目,然后根据值是否匹配来分隔这些值。是否有特定的运算符或脚本可以帮助尽可能优雅地完成此任务?
示例 IDlist1 |
---|
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 解决方案:
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
$