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é.
Avec awk
:
awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile
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)
UNE 1
non 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é".
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
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
grep '^1( | )' file
grep '^1[[:blank:]]' file
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).
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.
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
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'
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
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.)
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.