reads.fasta
約5,000,000行を含む大きなファイル(例:)と、reads_of_interest
抽出したい行番号のリストを含む他のファイルがあります。reads.fasta
これを行う簡単なコマンドライン方法はありますか?
つまり、ファイルがありますlarge_file.txt
。line_numbers.txt
形式に異なるファイルがあります。
12
134
1456
私はそれから12
、、行を抽出したいと思います。134
抽出する行数は約500,000行です。1456
large_file.txt
ありがとうございます!
答え1
これはあなたが望むものを得るための簡単で直接的な方法です。ここで問題は、すべてがlarge_file.txt
スキャンされることです。速度が遅すぎる場合は、別の方法を試してください。そのうちの1つは、行番号で入力されたデータベースにファイルをロードすることです。これは、ファイルのスキャンと比較して非常に高速な検索を提供します。
#!/bin/sh
awk '
NR == FNR {
for (i=1; i<=NF; i++) {
linenums[$i]
}
}
NR != FNR {
if (FNR in linenums) {
print
}
}
' line_numbers.txt large_file.txt
NR
は現在のレコード番号(Number of Records)、FNR
は現在のファイルの現在のレコード番号です。
したがって、NR == NFR
awkが最初のファイル引数を処理するとき、NR != NFR
awk
2番目(またはそれ以降)のファイルはいつ処理されますか?
これはすべての行番号を読み取り、データ要素なしでキー(配列)のみを持つ配列にキーとしてline_numbers.txt
保存します。linenums
large_file.txt
2 番目のファイルを読み取るとき、現在のレコード番号がすでに配列のキーとして保存されている場合は、linenums
次の行が印刷されます。large_file.txt
配列内の行番号を見つけるこの方法は、内部ハッシュアルゴリズムを使用してキーを見つけるため、linenums
比較的高速です。awk
答え2
file_numbers.txtに1行が含まれていて、その行が大きすぎないと仮定すると、次のようになります。
sed -n "$(<file_numbers.txt sed -e "s/ /p;/g" -e "s/$/p/")" large_file.txt