シェルスクリプトを使用して、他のファイルの数が範囲内にあることを確認し、その一致に関するすべての情報を出力します。

シェルスクリプトを使用して、他のファイルの数が範囲内にあることを確認し、その一致に関するすべての情報を出力します。

2つの入力ファイルがあります

File A

chr1    1167639 0
chrX    114868305   14
chr1    1167653 0
chr11   62389325    2
chr9    140127768   17

File B

chr10   73082492    73082831 SLC29A3
chr11   46332562    46332760 CREB3L1
chr11   62389317    62389439 B3GAT3
chrX    22056566    22056675 PHEX
chrX    114868291   114868413 PLS3

これが私が望む出力です

chrX    114868305   14 chrX    114868291   114868413   PLS3
chr11   62389325    2  chr11   62389317    62389439    B3GAT3

私が望むのは、ファイルBの列1からファイルAの列1要素を見つけることです。文字列が同じ場合は、ファイルAの2番目の列番号を取得し、ファイルBの2番目の列と3番目の列の間のファイルB番号の範囲に含まれていることを確認してください。含まれている場合は、ファイルAとファイルBの行を出力の1行に印刷します。

ベストアンサー1

$ cat tst.awk
BEGIN { OFS="\t" }
NR==FNR {
    ++cnt[$1]
    beg[$1,cnt[$1]] = $2
    end[$1,cnt[$1]] = $3
    val[$1,cnt[$1]] = $0
    next
}
$1 in cnt {
    for (i=1; i<=cnt[$1]; i++) {
        if ( (beg[$1,i] <= $2) && ($2 <= end[$1,i]) ) {
            print $0, val[$1,i]
        }
    }
}

$ awk -f tst.awk fileB fileA
chrX    114868305   14  chrX    114868291   114868413 PLS3
chr11   62389325    2   chr11   62389317    62389439 B3GAT3

上記は、タブで区切られた出力が必要であると仮定しています。それ以外の場合は削除しBEGIN { OFS="\t" }、視覚的にテーブルとして表示するにはパイプで接続しますcolumn -t

おすすめ記事