ファイルの数が2つの列の間にある場合は、次の行を印刷します。

ファイルの数が2つの列の間にある場合は、次の行を印刷します。

ファイル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+xif 条件のビジネスは、値が文字列ではなく数値で比較されることを保証します。これが必要な理由はひも比較すると、「10」<="23444"<="30"は本物

関連情報