セカンダリリストにエントリがあるかどうかに応じてリストを分割するBashスクリプトはありますか?

セカンダリリストにエントリがあるかどうかに応じてリストを分割するBashスクリプトはありますか?

処理する必要がある2つの値のリスト(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
$

関連情報