GNU/Linux >> Tutoriales Linux >  >> Linux

Grep líneas que comienzan con 1, pero no 10, 11, 100, etc.

La pregunta en el cuerpo

Seleccione líneas que comiencen con un 1 y van seguidos de un espacio

grep -c '^1\s'          file
grep -c '^1[[:space:]]' file

Eso también dará el conteo de líneas (sin necesidad de llamar a wc)

La pregunta del título

Un 1 no seguido de otro número (o nada):

grep -cE '^1([^0-9]|$)' file 

Pero las dos soluciones anteriores tienen algunos problemas interesantes, sigue leyendo.

En el cuerpo de la pregunta, el usuario afirma que el archivo está "delimitado por tabuladores".

Delimitador

pestaña

Una línea que comienza con un 1 seguido de una pestaña (una pestaña real en el comando). Esto falla si el delimitador es un espacio (o cualquier otro, o ninguno):

grep '^1    ' file

espacio

Una línea que comienza con un 1 seguido de un espacio (un espacio real en el comando). Esto falla si el delimitador es cualquier otro o ninguno.:

grep '^1 ' file

tabulador o espacio

grep '^1(   | )' file
grep '^1[[:blank:]]' file

espacio en blanco

Una opción más flexible es incluir varios caracteres de espacio (horizontal y vertical). El [:space:] el conjunto de clases de caracteres se compone de (espacio), \t (pestaña horizontal), \r (retorno de carro),\n (nueva línea), \v (pestaña vertical) y \f (alimentación de formulario). Pero grep no puede coincidir con una nueva línea (es una limitación interna que solo podría evitarse con el -z opción). Es posible usarlo como una descripción en el delimitador. También es posible, y más corto, usar la abreviatura disponible de GNU de \s :

grep -c '^1[[:space:]]` file
grep -c '^1\s'          file

Pero esta opción fallará si el delimitador es algo así como dos puntos : o cualquier otro carácter de puntuación (o cualquier letra).

Límite

O bien, podemos usar la transición de un dígito a un límite "no es un dígito", bueno, en realidad "un carácter que no está en [_[:alnum:]] (_a-zA-Z0-9 )":

grep -c  '^1\b' file       # portable but not POSIX.
grep -c  '^1\>' file       # portable but not POSIX.
grep -wc '^1'   file       # portable but not POSIX.
grep -c  '^1\W' file       # portable but not POSIX (not match only a `1`) (not underscore in BSD).

Esto aceptará como válidas las líneas que comiencen con un 1 y vayan seguidas de algún carácter de puntuación.


Parece que solo quieres esto:

$ grep '^1\b' a
1        TGCAG.....
1        TGCAG......

Para la parte de conteo de esto:

$ grep -c '^1\b' file
2

Con awk :

awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile

Linux
  1. Listado de todas las direcciones de correo electrónico en un archivo con grep

  2. ¿Compara directorios pero no contenido de archivos?

  3. ¿Imprimir líneas si la columna dada comienza con una letra mayúscula?

  4. ¿Cómo generar un archivo e ignorar las líneas que comienzan con "?"?

  5. ¿Núcleo volcado, pero el archivo principal no está en el directorio actual?

El tutorial de comando Grep con ejemplos para principiantes

Manipulación de texto con sed y grep

¿Cómo contar el número de líneas en un archivo después de una coincidencia Grep?

Eliminar líneas vacías en un archivo de texto a través de grep

Ordenar con separador de campo

¿Cómo obtener líneas que contienen cadenas en un archivo?