Reacties
Antwoord
Met awk
:
Reacties
- Leuke bijkomstigheid met het totaal!
- Plus kan
awk '{print $1}' <inputfile|sort -n|uniq -c
verkrijg een samenvatting van de telfrequenties van de tags. - Indirect
inputfile
met<
, maar ja inderdaad.
Antwoord
De vraag in het hoofdgedeelte
Selecteer regels die beginnen met een 1
en worden gevolgd door een spatie
grep -c "^1\s" file grep -c "^1[[:space:]]" file
Dat geeft ook het aantal regels (zonder de oproep naar wc)
De vraag in de titel
A 1
niet gevolgd door een ander nummer (of niets):
grep -cE "^1([^0-9]|$)" file
Maar beide bovenstaande oplossingen hebben enkele interessante kwesties, blijf lezen.
In de hoofdtekst van de vraag beweert de gebruiker dat het bestand “door tabs gescheiden” is.
Scheidingsteken
tab
Een regel die begint met wi th a 1
gevolgd door een tab (een daadwerkelijke tab in de opdracht). Dit mislukt als het scheidingsteken een spatie is (of een andere, of geen):
grep "^1 " file
spatie
Een regel die begint met een 1
gevolgd door een spatie (een werkelijke spatie in het commando). Dit mislukt als het scheidingsteken een ander of geen is .:
grep "^1 " file
tab of spatie
grep "^1( | )" file grep "^1[[:blank:]]" file
witruimte
Een meer flexibele optie is om meerdere spaties (horizontale en verticale) tekens op te nemen. De [:space:]
-tekenset is samengesteld uit (spatie),
\t
(horizontale tab ), \r
(regelterugloop), \n
(nieuwe regel), \v
(verticaal tabblad ) en \f
(form feed). Maar grep kan niet overeenkomen met een nieuwe regel (het is een interne beperking die alleen kon worden vermeden met de optie -z
). Het is mogelijk om het als omschrijving op het scheidingsteken te gebruiken. Het is ook mogelijk, en korter, om de voor GNU beschikbare afkorting van \s
te gebruiken:
grep -c "^1[[:space:]]` file grep -c "^1\s" file
Maar deze optie zal mislukken als het scheidingsteken zoiets is als een dubbele punt :
of een ander leesteken (of een willekeurige letter).
Boundary
Of, we kunnen de overgang gebruiken van een cijfer naar een “geen cijfer” grens, nou ja, eigenlijk “een teken niet in [_[: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).
Dit accepteert als geldige regels die beginnen met een 1 en gevolgd worden door een bepaald leesteken.
Opmerkingen
- Het is onmogelijk dat de regels die door de gebruiker worden gepresenteerd:
1 TGCAG…
alleen een1
(dat wil zeggen: zonder genomische gegevens). Maar hoe dan ook, er kwam ook een haalbare oplossing bij.@St é phaneChazelas
Antwoord
Klinkt net als jij wil dit:
$ grep "^1\b" a 1 TGCAG..... 1 TGCAG......
Voor het telgedeelte hiervan:
$ grep -c "^1\b" file 2
Answer
Elk van deze selecteert regels met een 1
in de eerste kolom
awk "$1 == 1" grep -w "^1"
Deze kunnen beide worden uitgebreid, zodat je de wc
niet eens nodig hebt om de regels te tellen
awk "$1==1 { x++ } END { print x }" grep -cw "^1"
Antwoord
Met grep
:
grep -c "^1\s" file
Dit komt overeen met elke regel die begint met een 1 onmiddellijk gevolgd door witruimte en geeft een telling van die regels (waardoor wc -l
)
$ cat input 79 TGCAG..... 1 TGCAG..... 1257 TGCAG..... 1 TGCAG...... $ grep -Ec "^1\s" input 2
Antwoord
Goede antwoorden hier, maar in de veronderstelling dat niet elke regel in een spatie eindigt (zoals als je gaat Als sommige daadwerkelijk uw “=”) halen, kunt u dit gebruiken:
grep -c "^1[^0-9]" file
Het komt in principe overeen met elke regel die begint met een, gevolgd door een niet-cijfer, inclusief witruimte. Iets meer uitgebreid, maar ook meer onfeilbaar. (Hoewel het vermeldenswaard is dat er hier niets is voor de null-voorwaarde van slechts-één-op-de-regel, is het niet “end-of-line” gevoelig.)
Opmerkingen
- Merk op dat het regels niet toestaat die alleen bestaan uit
1
. Als dat ' s niet gewenst, gebruik bijv.^1($|[^0-9])
Answer
U kunt onderstaande regel ook gebruiken:
$ awk -F" " "{if($1=="1") print $0}" <your file name> | wc -l
De parameter -F
maakt van het veldscheidingsteken een witruimte . Als de waarde van het eerste veld “1” is, wordt de regel ervan afgedrukt.
-
, en de huidige dergelijke antwoorden vereisen ofwel PCRE (wat niet vereist is hier), of neem ASCII-spatie aan als scheidingsteken, niet als tab-teken.