数十億行の TSV ファイル内の列をフィルター処理する方法

数十億行の TSV ファイル内の列をフィルター処理する方法

私は数十億行のデータを含むリストを扱っています。

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

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

必要なものをどうやって手に入れますか?

答え1

次のワンライナーを試してみてください:

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

詳細:
cut -f4 in.tsv: 入力ファイルの 4 番目の TAB 区切り列を出力します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

要件が明確ではありません。最初の行を除いて、6番目の列(「製品」というラベル)の値が「仮想タンパク質」と異なるのは、4番目の列(「遺伝子」というラベル)の値のみであると仮定します。

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}: …すべてのインデックスを印刷します。

関連情報