Spørsmålet i kroppen
Velg linjer som starter med et 1
og etterfølges av et mellomrom
grep -c "^1\s" file grep -c "^1[[:space:]]" file
Som også vil gi tellingen av linjer (uten å måtte ringe til wc)
Spørsmålet i tittelen
A 1
ikke etterfulgt av et annet nummer (eller ingenting):
grep -cE "^1([^0-9]|$)" file
Men begge løsningene ovenfor har noen interessante problemer, fortsett å lese.
I selve spørsmålet hevder brukeren at filen er «tabulatoravgrenset».
Avgrenser
fane
En linje som starter med th a 1
etterfulgt av en fane (en faktisk fane i kommandoen). Dette mislykkes hvis avgrenseren er et mellomrom (eller noe annet, eller ingen):
grep "^1 " file
mellomrom
En linje som begynner med en 1
etterfulgt av et mellomrom (et faktisk mellomrom i kommandoen). Dette mislykkes hvis skilletegnet er noe annet eller ingen:
grep "^1 " file
fane eller mellomrom
grep "^1( | )" file grep "^1[[:blank:]]" file
mellomrom
Et mer fleksibelt alternativ er å inkludere flere mellomrom (horisontale og vertikale) tegn. [:space:]
tegnsett sett består av
(mellomrom), \t
(vannrett fane ), \r
(vognretur), \n
(ny linje), \v
) og \f
(skjema feed). Men grep kan ikke matche en ny linje (det er en intern begrensning som bare kunne unngås med -z
alternativet). Det er mulig å bruke den som en beskrivelse på avgrenseren. Det er også mulig, og kortere, å bruke GNU tilgjengelig forkortelse av \s
:
grep -c "^1[[:space:]]` file grep -c "^1\s" file
Men dette alternativet vil mislykkes hvis avgrenseren er omtrent som et kolon :
eller et annet tegnsettingstegn (eller hvilken som helst bokstav).
Grense
Eller, vi kan bruke overgangen fra et siffer til en «ikke et siffer» -grense, vel, faktisk «et tegn som ikke er i [_[: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).
Dette godtas som gyldige linjer som begynner med en 1 og blir fulgt av noen skilletegn.
Kommentarer
En av disse vil plukke ut linjer med 1
i den første kolonnen
awk "$1 == 1" grep -w "^1"
Disse kan begge utvides slik at du ikke engang trenger wc
for å telle linjene
awk "$1==1 { x++ } END { print x }" grep -cw "^1"
Gode svar her, men antar at ikke hver linje ender i et mellomrom (som om du har gått t noen som faktisk gjør det til «=»), kan du bruke dette:
grep -c "^1[^0-9]" file
Det samsvarer i utgangspunktet for en linje som begynner med en, etterfulgt av et ikke-sifret, inkludert hvitt mellomrom. Litt mer ordentlig, men også mer idiotsikker. (Selv om det er verdt å merke seg at det ikke er noe her for null-tilstanden til bare en-på-linjen, er den ikke følsom overfor slutten av linjen.)
Kommentarer
Du kan også bruke linjen nedenfor:
$ awk -F" " "{if($1=="1") print $0}" <your file name> | wc -l
Parameteren -F
gjør feltskilleren til et mellomrom . Hvis det første feltets verdi er «1», blir linjen skrevet ut.