Como filtrar coluna no arquivo TSV com bilhões de linhas

Como filtrar coluna no arquivo TSV com bilhões de linhas

Estou trabalhando com uma lista com bilhões de linhas de dados.

Eu tenho dados como este: insira a descrição da imagem aqui

Como você pode ver, na quarta coluna (coluna do gene) existem nomes de genes, mas nem todas as linhas têm um "nome do gene". Preciso obter a lista completa de "nomes do gene" da quarta coluna.

Como posso conseguir o que preciso?

Responder1

Experimente esta linha:

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

Detalhes::
cut -f4 in.tsvgera a quarta coluna delimitada por TAB do arquivo de entrada in.tsv.
tail -n +2: remova a primeira linha (cabeçalho).
grep -P '\S': mantenha apenas as linhas que possuem caracteres que não sejam espaços em branco, ou seja, remova as linhas em branco. -Pdiz greppara usar expressões regulares Perl.

Se você precisar apenas dos nomes exclusivos dos genes, adicione sort -uassim:

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

Responder2

Não está claro qual é a sua necessidade. Supondo que, excluindo a primeira linha, são apenas os valores da quarta coluna (rotulado "gene"), cujo valor na sexta coluna (rotulado "produto") é diferente de "proteína hipotética"

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

Explicação

tail -n +2 file.tsv

exclui a primeira linha ("locus_tag", "type", etc.)

grep -v "hypothetical protein"

exclui todas as linhas que contêm a string "proteína hipotética"

cut -f4 -d$'\t'

imprime a quarta coluna.

Responder3

Isso parece uma tarefa para awk. Você pode tentar:

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

Seguindo a sugestão útil dos comentários:

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

Responder4

Usando o awk:

awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
  • -F'\t': Dividir na guia.
  • $4 != "": Se o 4º campo não estiver vazio…
  • {arr[$4] = 1}:…use-o como índice em uma atribuição de array.
    • As instâncias subsequentes do mesmo índice substituirão a entrada da matriz, nenhuma duplicata será armazenada.
    • O valor atribuído ( 1) é arbitrário 0ou "blergh"funcionaria igualmente bem.
  • END: Quando todas as linhas tiverem sido lidas…
  • {for (idx in arr) print idx}:…imprime todos os índices.

informação relacionada