Estou trabalhando com uma lista com bilhões de linhas de dados.
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.tsv
gera 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. -P
diz grep
para usar expressões regulares Perl.
Se você precisar apenas dos nomes exclusivos dos genes, adicione sort -u
assim:
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ário0
ou"blergh"
funcionaria igualmente bem.
END
: Quando todas as linhas tiverem sido lidas…{for (idx in arr) print idx}
:…imprime todos os índices.