Komentáře
Odpovědět
S awk
:
Komentáře
- Nice touch w / the total!
- Plus může používat
awk '{print $1}' <inputfile|sort -n|uniq -c
získejte souhrn frekvencí počtu značek. - Není třeba nepřímo
inputfile
používat<
, ale ano.
Odpověď
Otázka v těle
Vyberte řádky, které začínají 1
a za nimi je mezera
grep -c "^1\s" file grep -c "^1[[:space:]]" file
Tím se také získá počet řádků (bez nutnosti volání na wc)
Otázka v nadpisu
A 1
not následované dalším číslem (nebo nic):
grep -cE "^1([^0-9]|$)" file
Ale obě výše uvedená řešení mají některé zajímavé problémy, čtěte dál.
V těle otázky uživatel tvrdí, že soubor je „oddělován tabulátory“.
Oddělovač
tab
Řádek začínající wi th a 1
následovaný záložkou (skutečná záložka v příkazu). To se nezdaří, pokud je oddělovač mezera (nebo jakýkoli jiný, nebo žádný):
grep "^1 " file
mezera
Řádek začínající znakem 1
následovaný mezerou (skutečná mezera v příkazu). To se nezdaří, pokud je oddělovač jiný nebo žádný:
grep "^1 " file
karta nebo mezera
grep "^1( | )" file grep "^1[[:blank:]]" file
mezery
Pružnější možností je zahrnout několik mezer (vodorovných a svislých) znaků. Sada znaků [:space:]
se skládá z (mezera),
\t
(vodorovná karta ), \r
(návrat vozíku), \n
(nový řádek), \v
(svislá karta ) a \f
(zdroj formuláře). Grep ale nemůže odpovídat novému řádku (jedná se o vnitřní omezení, kterému se lze vyhnout pouze pomocí možnosti -z
). Je možné jej použít jako popis na oddělovači. Je také možné a kratší použít GNU dostupnou zkratku \s
:
grep -c "^1[[:space:]]` file grep -c "^1\s" file
Ale tato možnost selže, pokud je oddělovač něco jako dvojtečka :
nebo jakýkoli jiný interpunkční znak (nebo jakékoli písmeno).
Hranice
Nebo, můžeme použít přechod z číslice na hranici „ne číslice“, vlastně, znak, který není v [_[: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).
Tím se přijmou platné řádky, které začínají číslicí 1 a za nimi následuje interpunkční znaménko.
Komentáře
- Není možné, aby řádky prezentované uživatelem:
1 TGCAG…
obsahovaly pouze a1
(tj. bez genomových dat). Ale každopádně se přidalo i životaschopné řešení.@St é phaneChazelas
odpověď
Zní to jako vy chcete toto:
$ grep "^1\b" a 1 TGCAG..... 1 TGCAG......
Počítající část tohoto:
$ grep -c "^1\b" file 2
Odpovědět
Kterýkoli z nich vybere řádky s 1
v prvním sloupci
awk "$1 == 1" grep -w "^1"
Oba je možné rozšířit, takže nepotřebujete ani wc
k počítání řádků
awk "$1==1 { x++ } END { print x }" grep -cw "^1"
Odpověď
Použití grep
:
grep -c "^1\s" file
To bude odpovídat libovolnému řádku začínajícímu 1 bezprostředně následovanou mezerami a poskytne počet těchto řádků (eliminuje potřebu wc -l
)
$ cat input 79 TGCAG..... 1 TGCAG..... 1257 TGCAG..... 1 TGCAG...... $ grep -Ec "^1\s" input 2
Odpověď
Dobré odpovědi zde, ale za předpokladu že ne každý řádek končí mezerou (jako kdybyste šli Někteří, kteří se skutečně dostanou do vašeho „=“), můžete použít toto:
grep -c "^1[^0-9]" file
V zásadě odpovídá libovolnému řádku, který začíná jedním, následovaným neciferný údaj, včetně mezer. Trochu podrobnější, ale také spolehlivější. (Ačkoli stojí za zmínku, že zde není nic pro nulový stav pouze jednoho na řádku, není to citlivé na konec řádku.)
Komentáře
- Upozorňujeme, že zakazuje řádky skládající se pouze z
1
. Pokud ' není žádoucí, použijte např.^1($|[^0-9])
odpověď
Můžete také použít následující řádek:
$ awk -F" " "{if($1=="1") print $0}" <your file name> | wc -l
Parametr -F
dělá z oddělovače polí prázdné znaky . Pokud je hodnota prvního pole „1“, vytiskne se jeho řádek.
-
a současné takové odpovědi buď vyžadují PCRE (což se nevyžaduje zde), nebo předpokládejte znak mezery ASCII jako oddělovač, nikoli znak tabulátoru.