1

3列の行(タブ区切り)のファイルがあります。例:

2 45 100

そして、3 列 (タブ区切り) の行を持つ 2 番目のファイル 例:

2 10 200

両方のファイルの $1 が一致し、ファイル 1 の $2-$3 の範囲がファイル 2 の $2-$3 の範囲とまったく交差する場合、行に一致する awk コマンドが必要です。ファイル 2 の値の範囲内にある可能性がありますまたは、ファイル 2 の範囲がファイル 1 の範囲内にある場合もあれば、部分的に重複している場合もあります。範囲間のあらゆる種類の交差は一致としてカウントされ、ファイル 3 の行が出力されます。

私の現在のコードは、$1 と $2 または $3 のいずれかが一致する場合にのみ一致しますが、正確な数値が一致しないため、範囲が相互にある場合は機能しません。

  awk '
        BEGIN {
            FS = "\t";
        }
        FILENAME == ARGV[1] {
            pair[ $1, $2, $3 ] = 1;
            next;
        }
        {
            if ( pair[ $1, $2, $3 ] == 1 ) {
                print $1 $2 $3;
            }
        }

入力例:

ファイル1:

1 10 23
2 30 50
6 100 110
8 20 25

ファイル 2:

1 5 15
10 30 50
2 10 100
8 22 24

ここで、行 1(file1) は行 1(file2) と一致します。これは、最初の列が一致し、かつ範囲 10-15 が両方の範囲で重複しているためです。行 2 (file1) が行 3(file2) と一致するためです。 10-100。行 4 (file1) は行 4 (file2) と一致します。これは、最初の列が一致し、範囲 22 ~ 24 が両方で重複しているためです。したがって、出力は file2 の 1、2、4 行目が新しい出力ファイルに出力されます。

これらの例が役立つことを願っています。

あなたの助けは本当に感謝しています.

前もって感謝します!

4

1 に答える 1

1

joinコマンドを使用して両方のファイルを最初のフィールド ($1) でマージすると、非常に簡単です。

出力として file2 行のみが必要な場合:

join --nocheck-order <(sort -n file1) <(sort -n file2) | awk '{if ($2 >= $4 && $2 <= $5 || $3 >= $4 && $3 <= $5 || $4 >= $2 && $4 <= $3 || $5 >= $2 && $5 <= $3) {print $1" "$4" "$5;}}' -

入力ファイルを使用して、次の出力を得ました。

1 5 15
2 10 100
8 22 24
于 2012-10-05T09:27:03.767 に答える