Estoy trabajando con una lista con miles de millones de filas de datos.
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.tsv
genera 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. -P
indica grep
que se utilicen expresiones regulares de Perl.
Si solo necesita los nombres únicos de los genes, agréguelos sort -u
así:
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 arbitrario0
o"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.