TSVファイルから数十億行の列をフィルタリングする方法

TSVファイルから数十億行の列をフィルタリングする方法

私は数十億行のデータを含むリストに取り組んでいます。

次のデータがあります。 ここに画像の説明を入力してください。

ご覧のとおり、4番目の列(遺伝子列)には遺伝子名がありますが、すべての行に「遺伝子名」があるわけではありません。 4番目の列で「遺伝子名」の完全なリストを取得する必要があります。

必要なものをどのように取得できますか?

答え1

次の1行を試してください。

cut -f4 in.tsv | tail -n +2 | grep -P '\S'

詳細::
cut -f4 in.tsv入力ファイルのタブで区切られた4番目の列を出力しますin.tsv
tail -n +2:最初の行(タイトル)を削除します。
grep -P '\S':空白以外の文字を含む行のみを保持します。つまり、空行を削除します。 Perl正規表現を使用するように -P教えてください。grep

一意の遺伝子名だけが必要な場合は、sort -u次のように追加してください。

cut -f4 in.tsv | tail -n +2 | grep -P '\S' | sort -u

答え2

あなたの要求が何であるかわからない。最初の行を除いて、4番目の列(「gene」で表される)の値が「仮説タンパク質」より6番目の列(「product」で表される)の値と異なると仮定します。

grep -v "hypothetical protein" < <(tail -n +2 file.tsv) | cut -f4 -d$'\t'

説明する

tail -n +2 file.tsv

最初の行を除外( 'locus_tag'、 'type'など)

grep -v "hypothetical protein"

「仮説タンパク質」文字列を含むすべての行を除外します。

cut -f4 -d$'\t'

4番目の列を印刷します。

答え3

これはミッションのようですawk。あなたは試すことができます:

awk '{if ($4); print $4 $7}' filename.tsv

コメントの有用な提案に基づいて:

awk 'BEGIN { FS = "\t" } ; $4 != "" { print $4 "\t" $7}'

答え4

awkを使用してください:

awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
  • -F'\t':タブに分割されます。
  • $4 != "":4番目のフィールドが空でない場合...
  • {arr[$4] = 1}:...配列割り当て時にインデックスとして使用します。
    • 同じインデックスの後続のインスタンスは配列エントリを上書きし、重複エントリは保存されません。
    • 指定された値(1)は任意0または"blergh"正常に機能します。
  • END:すべての行を読んだとき...
  • {for (idx in arr) print idx}:...すべてのインデックスを印刷します。

関連情報