如何過濾 TSV 檔案中數十億行的列

如何過濾 TSV 檔案中數十億行的列

我正在處理一個包含數十億行資料的清單。

我有這樣的數據: 在此輸入影像描述

正如您所看到的,在第四列(基因列)中存在基因名稱,但並非所有行都有「基因名稱」。我需要從第四列獲取“基因名稱”的完整列表。

我怎麼才能得到我需要的東西?

答案1

試試這個單行:

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

詳細資訊:
cut -f4 in.tsv:輸出輸入檔案的第四個製表符分隔列in.tsv
tail -n +2:刪除第一行(標題)。
grep -P '\S':只保留有非空白字元的行,即刪除空白行。-P告訴grep我們使用 Perl 正規表示式。

如果您只需要唯一的基因名稱,請sort -u像這樣添加:

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

答案2

目前尚不清楚您的要求是什麼。假設,排除第一行,只有第四列(標記為“基因”)的值,其第六列(標記為“產品”)的值與“假設蛋白質”不同

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'

列印第四列。

答案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 != "":如果第四個欄位不為空...
  • {arr[$4] = 1}: …使用它作為數組賦值中的索引。
    • 相同索引的後續實例將覆蓋數組條目,不儲存重複項。
    • 指定的值 ( 1) 是任意的,0"blergh"也可以正常運作。
  • END:當所有行都讀完後...
  • {for (idx in arr) print idx}: ...列印所有索引。

相關內容