Mám tento soubor
a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z
A já chcete shodovat přesný řetězec 200 pomocí awk
. Můj výsledek by tedy měl být
a deiauk Biking US 200 G
Zde je můj kód
awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt
Ale po že mám všechny řádky.
Komentáře
Odpovědět
Protože chcete přesnou shodu, proč nepoužívat ==
?
$ cat >file a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z a auie auie 200 B b nrst nrst 200 C $ awk "$(NF-1)==200{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Svou shodu můžete omezit také pomocí /^200$/
:
$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Upravit:
Zkoušel jsem váš příkaz a měl by fungovat. Jste si jisti svým -F " "
?
Comm ents
- Ano
-F ' '
je v mé ituakci v pořádku. Nevím ' proč, ale stále mám stejný problém
Odpovědět
S awk
stačí:
awk "$0~/ 200 /" file
Nebo sed
(\s
odpovídá jakýmkoli mezerám):
sed -n "/\s200\s/p" file
A grep
řešení (-P
pro perl regex):
grep -P "\s200\s" file
Pokud to musí být čisté bash
:
while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file
Pokud si nejste jisti, zda existují mezery, karty, cokoli ([[:space:]]
je jako \s
, v sed
a grep
výše uvedených řešeních ):
while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
Komentáře
- V
grep
bude fungovat bez-P
takégrep '\s200\s' file
odpovědi
Myslím, že thi s pomůže. Tím se vytiskne pouze vzorek obsahující řádek. Ve vašem případě je vzor 200
grep "200" file-name
awk
kód vytiskne jediný řádek? Už jste se vůbec obtěžovali pochopit, co to má dělat?200
; ii) první pole a iii) předposlední pole. Proč byste očekávali, že vytiskne celý řádek? Jaký výstup vlastně dostáváte?