私のファイル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の行を印刷することです。
- ファイルAの最初の列の数字がファイルBの最初の列の数字と一致し、
- ファイル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
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=3、B2=2とB3=4、一致します
( b -le d && b -ge c )
。 - もしA2=3、B2=4とB3=2、一致します
( b -le c && b -ge d )
。
- もしA2=3、B2=2とB3=4、一致します
あまり良くない牛に似た一種の栄養
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