ファイル1の数値IDのリストを2つの列に一致させたい(各行には異なる数値/ IDがあります)。
>cat file1
1 23444
3 422255223
1 35541
そして、最初の列が一致し、2番目の列IDがfile2のIDの間にあるより大きなファイル(file2)の行のみを印刷します。
>cat file 2
1 10 30 XP2
1 31 50 XP34
1 23000 25000 XP56
2 19000 30000 Xp9J
スクリプトを実行し、一致するものが見つかった場合、理想的にはファイル1のIDのみを出力し、列間の一致後に一致する列を出力します。たとえば、次のようになります。
awk code file1 file2
1 23444 XP56
ここで公開されている問題に近い解決策はすでにあります。 Awk - 数字が列1と2の間にある場合、行を印刷します。
しかし、2つの列の一致に対応し、ファイル(file1)を1行ずつ照会するようにスクリプトを変更することは困難です。
答え1
この回答はGNU-awkに固有です。配列の配列を使用します。
gawk '
NR == FNR { f1[$1][$2] = 1; next }
$1 in f1 {
for (val in f1[$1]) {
if (0+$2 <= 0+val && 0+val <= 0+$3) {
print $1, val, $4
}
}
}
' file1 file2
0+x
if 条件のビジネスは、値が文字列ではなく数値で比較されることを保証します。これが必要な理由はひも比較すると、「10」<="23444"<="30"は本物。