4つの列()を持つファイルがありますfile1.txt
。
chr1 1156 G G
chr1 1157 A A
chr1 1165 T T
chr1 1173 C C
chr1 1175 G G
chr1 1178 T T
chr1 1181 C C
chr1 1186 G G
2番目のファイル(file2.txt
)には範囲、2つの列が含まれています。
1100 1160
1170 1180
file1
2列が範囲に属する行を抽出したいと思いますfile2
。上記の例では、目的の出力は次のようになります。
chr1 1156 G G
chr1 1157 A A
chr1 1173 C C
chr1 1175 G G
chr1 1178 T T
同様の投稿に基づいて試しましたが、結果は出ませんでした。
awk 'NR==FNR{ range[$1,$2]; next }{for(x in range) {split(x, check, SUBSEP); if($2>=check[1] && $2<=check[2]) print}} ' file2.txt file1.txt > output.txt
私も同じ幸運で以下を試しました。
awk 'NR == FNR {ref[$1][$2]} if ($1 <= key && key <= $2) sum += ref[$2][key] print $0, sum} file2.txt file1.txt > output.txt
誰でも提案があれば大変感謝します。
ベストアンサー1
次のawk
プログラムは、次のことを行う必要があります。
awk 'NR==FNR{rng++;start[rng]=$1;end[rng]=$2;next}
{for (i=1;i<=rng;i++) if (($2>=start[i])&&($2<=end[i])) {print; next}}' file2.txt file1.txt
仕組みは次のとおりです。
- 最初の入力ファイル(ファイルごとの
file2.txt
ラインカウンタと同じグローバルラインカウンタとして表示されます)の解析中に、範囲の開始番号と終了番号を2つの配列に登録し(1つの配列の範囲数を計算している間)、カウンタ)。その後すぐに次の実行ラインにジャンプします。NR
FNR
start
end
rng
file1.txt
(NR
これより大きい)を処理するときは、各行の列2がそれぞれおよび配列の対応する項目によって指定された範囲内にあることをFNR
確認してください。その場合は、現在の行を印刷し、次の行にジャンプします。start
end