処理する必要がある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
$