Awk: shoda přesného řetězce v řádku

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

  • Proč očekáváte, že váš awk kód vytiskne jediný řádek? Už jste se vůbec obtěžovali pochopit, co to má dělat?
  • Vaše awk vytiskne i) kolikrát jste viděli toto 1. pole, kde předposlední pole je 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?

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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *