web-dev-qa-db-fra.com

Lignes Grep commençant par 1, mais pas 10, 11, 100, etc.

J'ai un fichier de données génomiques avec des numéros de balises, je veux savoir combien de personnes sont représentées une fois:

$ grep "^1" file |wc -l

comprend toutes les lignes commençant par 1, il comprend donc des balises représentées 10 fois, 11, des temps, 100 fois, 1245 fois, etc. Comment puis-je faire cela?

Current format
79      TGCAG.....
1       TGCAG.....
1257    TGCAG.....
1       TGCAG......

Je veux seulement les lignes qui sont:

1       TGCAG.....

Il ne peut donc pas inclure les lignes commençant par 1257. REMARQUE : Le fichier ci-dessus est délimité.

11
mah

Avec awk:

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

La question dans le corps

Sélectionnez des lignes commençant par un 1 et sont suivis d'un espace

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

Cela donnera également au nombre de lignes (sans avoir besoin de l'appel à WC)

La question dans le titre

UNE 1non suivi d'un autre numéro (ou rien):

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

Mais les deux solutions ci-dessus ont des problèmes intéressants, continuent à lire.


Dans le corps de la question, l'utilisateur affirme que le fichier est "tabulation délimité".

Délimiteur

languette

Une ligne commençant par un 1 suivi d'un onglet (un onglet réel dans la commande). Cela échoue si le délimiteur est un espace (ou tout autre ou aucun):

grep '^1    ' file

space

Une ligne commençant par un 1 suivi d'un espace (un espace réel dans la commande). Cela échoue si le délimiteur est tout autre ou aucun.:

grep '^1 ' file

onglet ou espace

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

blancheur

Une option plus flexible consiste à inclure plusieurs caractères d'espace (horizontal et vertical). Les [:space:] Le jeu de classe de caractères est composé de (espace), \t (onglet horizontal), \r (retour chariot), \n(nouvelle ligne), \v (onglet vertical) et \f (flux de formulaire). Mais le GREP ne peut pas correspondre à une nouvelle ligne (il s'agit d'une limitation interne qui ne pourrait être évitée qu'avec le -z option). Il est possible de l'utiliser comme une description sur le délimiteur. Il est également possible et plus court, d'utiliser le GNU DISPONIBLE SWORDAND DE \s:

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

Mais cette option échouera si le délimiteur est quelque chose comme un colon : ou tout autre caractère de ponctuation (ou une lettre).

Frontière

Ou, nous pouvons utiliser la transition d'un chiffre à une limite "non à un chiffre", bien, en fait "un personnage pas dans [_[: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).

Cela acceptera comme des lignes valides qui commencent par un 1 et sont suivies d'un caractère de ponctuation.

27
Isaac

On dirait que tu veux juste ça:

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

Pour la partie de comptage de cette:

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

L'un de ceux-ci choisira des lignes avec un 1 Dans la première colonne

awk '$1 == 1'
grep -w '^1'

Celles-ci peuvent tous les deux être étendues de sorte que vous n'avez même pas besoin de wc pour compter les lignes

awk '$1==1 { x++ } END { print x }'
grep -cw '^1'
14
roaima

En utilisant grep:

grep -c '^1\s' file

Cela correspondra à n'importe quelle ligne commençant par un 1 immédiatement suivie de WhitSpace et fournit un nombre de ces lignes (éliminant la nécessité de wc -l)


$ cat input
79       TGCAG.....
1        TGCAG.....
1257     TGCAG.....
1        TGCAG......
$ grep -Ec '^1\s' input
2
5
jesse_b

De bonnes réponses ici, mais en supposant que toutes les lignes ne se termine pas dans un espace (comme si vous en avez quelques-unes qui le rendent réellement à votre "="), vous pouvez utiliser ceci:

 grep -c "^1[^0-9]" file

Il correspond essentiellement à une ligne qui commence par une, suivie d'un espace non chiffré, y compris de l'espace blanc. Un peu plus verbeux, mais aussi plus infaillible. (Bien qu'il vaut la peine de noter qu'il n'y a rien ici pour la condition nulle du juste-un-sur-the-ligne, ce n'est pas la fin de la ligne.)

3

Vous pouvez également utiliser la ligne ci-dessous:

$ awk -F' ' '{if($1=="1") print $0}' <your file name> | wc -l

Le paramètre -F rend le séparateur de champ un espace blanche. Si la valeur du premier champ est "1", sa ligne sera imprimée.

0
Hossein Ojani