Как отфильтровать столбец в файле 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 != "": Если 4-е поле не пустое…
  • {arr[$4] = 1}: …использовать его как индекс в массиве-назначении.
    • Последующие экземпляры того же индекса перезапишут запись массива, дубликаты не сохраняются.
    • Присвоенное значение ( 1) является произвольным 0или "blergh"работало бы так же хорошо.
  • END: Когда все строки прочитаны…
  • {for (idx in arr) print idx}: …распечатать все индексы.

Связанный контент