Bash 脚本根据辅助列表中是否存在行项目来拆分列表?

Bash 脚本根据辅助列表中是否存在行项目来拆分列表?

我有两个需要处理的值列表: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
$

相关内容