решение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}
: …распечатать все индексы.