あるファイルの2つの列を別のファイルの3つの列と一致させ、2つの列を含むファイルの行を印刷します。

あるファイルの2つの列を別のファイルの3つの列と一致させ、2つの列を含むファイルの行を印刷します。

私のファイルAには、次の2つの列があります。

7000000185249100 162280
7000000185249048 235500
7000000185249052 755361
7000000185249068 427550
7000000185249070 269102
7000000185249081 291122

私のファイルBには、次の3つの列が含まれています。

7000000185249100 1622651 1623044
7000000185249048 235104 235805
7000000185249146 2500324 2502635
7000000185249100 1218818 1221734
7000000185249468 88587 89699
7000000185249239 299691 300277
7000000185249315 769635 769986
7000000185249374 1548986 1549747

だから私がしたいのは、ファイルAの行を印刷することです。

  1. ファイルAの最初の列の数字がファイルBの最初の列の数字と一致し、
  2. ファイルAの2番目の列の数字は、ファイルBの2番目と3番目の列の数字の範囲内です。

予想される出力は次のとおりです。

7000000185249048 235500

次のコードを試しましたが失敗しました。

awk -F '\t' 'FNR==NR{a[$1,$2,$3]=$0;next}{if(b=a[$1, >=$2 && <= $3]){print b}}' file B file A

ベストアンサー1

  1. join共通点を見つけるために使用される初めてbashフィールドは値を比較するために使用されます。

    join --nocheck-order -j 1 A B | 
    while read a b c d ; do 
        [[ ( b -le d && b -ge c ) || ( b -le c && b -ge d ) ]] && echo $a $b
    done 
    

    これOP仕様"ファイルAの2番目の列の数字は、ファイルBの2番目と3番目の列の数字の範囲内です。[[ ". 範囲は​​並べ替えられない可能性があるため、 との間の論理は]]これをどちらにも処理します。 例:

    • もしA2=3B2=2B3=4、一致します( b -le d && b -ge c )
    • もしA2=3B2=4B3=2、一致します( b -le c && b -ge d )
  2. あまり良くない牛に似た一種の栄養 sedファイルの各行のコードを変換します。第二2つのパイプに分かれているnumgrepファイル検索コマンド範囲の場合 e評価注文する。コマンドの結果リストに重複した出力がある可能性があるため、次にパイプします。awkソートされていない状態で実行ユニーク:

        sed -n \
        's#\(\w*\)\W*\(\w*\)\W*\(\w*\)#numgrep /\1/ A\|numgrep /\2..\3,\3..\2/#e
         /./p' B |
        awk '!a[$0]++'
    

2つの方法のうちの1つの出力:

7000000185249048 235500

おすすめ記事