Cómo filtrar una columna en un archivo TSV con miles de millones de filas

Cómo filtrar una columna en un archivo TSV con miles de millones de filas

Estoy trabajando con una lista con miles de millones de filas de datos.

Tengo datos como este: ingrese la descripción de la imagen aquí

Como puede ver, en la cuarta columna (columna de genes) existen nombres de genes, pero no todas las filas tienen un "nombre de gen". Necesito obtener la lista completa de "nombres de genes" de la cuarta columna.

¿Cómo puedo conseguir lo que necesito?

Respuesta1

Pruebe esta frase breve:

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

Detalles:
cut -f4 in.tsvgenera la cuarta columna delimitada por TAB del archivo de entrada in.tsv.
tail -n +2: elimina la primera línea (encabezado).
grep -P '\S': mantenga solo las líneas que tengan caracteres que no sean espacios en blanco, es decir, elimine las líneas en blanco. -Pindica grepque se utilicen expresiones regulares de Perl.

Si solo necesita los nombres únicos de los genes, agréguelos sort -uasí:

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

Respuesta2

No está claro cuál es su requisito. Suponiendo que, excluyendo la primera fila, son sólo los valores de la cuarta columna (etiquetada como "gen"), cuyo valor en la sexta columna (etiquetada como "producto") es diferente de "proteína hipotética"

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

Explicación

tail -n +2 file.tsv

excluye la primera fila ("locus_tag", "tipo", etc.)

grep -v "hypothetical protein"

excluye todas las filas que contienen la cadena "proteína hipotética"

cut -f4 -d$'\t'

imprime la cuarta columna.

Respuesta3

Esto parece una tarea para awk. Podrías intentar:

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

Siguiendo la útil sugerencia de los comentarios:

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

Respuesta4

Usando awk:

awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
  • -F'\t': Dividir en pestaña.
  • $4 != "": Si el cuarto campo no está vacío…
  • {arr[$4] = 1}: …úselo como índice en una asignación de matriz.
    • Las instancias posteriores del mismo índice sobrescribirán la entrada de la matriz y no se almacenarán duplicados.
    • El valor asignado ( 1) es arbitrario 0o "blergh"funcionaría igual de bien.
  • END: Cuando se hayan leído todas las líneas…
  • {for (idx in arr) print idx}: …imprime todos los índices.

información relacionada