テキストファイルから行を抽出するコマンドラインツール

テキストファイルから行を抽出するコマンドラインツール

reads.fasta約5,000,000行を含む大きなファイル(例:)と、reads_of_interest抽出したい行番号のリストを含む他のファイルがあります。reads.fasta

これを行う簡単なコマンドライン方法はありますか?

つまり、ファイルがありますlarge_file.txtline_numbers.txt形式に異なるファイルがあります。

12 
134
1456

私はそれから12、、行を抽出したいと思います。134抽出する行数は約500,000行です。1456large_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 == NFRawkが最初のファイル引数を処理するとき、NR != NFR awk2番目(またはそれ以降)のファイルはいつ処理されますか?

これはすべての行番号を読み取り、データ要素なしでキー(配列)のみを持つ配列にキーとしてline_numbers.txt保存します。linenums

large_file.txt2 番目のファイルを読み取るとき、現在のレコード番号がすでに配列のキーとして保存されている場合は、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

関連情報