Awk: dopasuj dokładny ciąg w wierszu

Mam ten plik

a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z 

I ja chcesz dopasować dokładny ciąg 200 za pomocą awk. Wynik powinien więc wyglądać następująco:

a deiauk Biking US 200 G 

Oto mój kod

awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt 

Ale po że mam wszystkie wiersze.

Komentarze

  • Dlaczego oczekujesz, że Twój kod awk wydrukuje pojedyncza linia? Czy w ogóle zadałeś sobie trud zrozumienia, co to ma zrobić?
  • Twój awk wypisze i) ile razy widziałeś to pierwsze pole, gdzie przedostatnie pole to 200; ii) pierwsze pole i iii) przedostatnie pole. Dlaczego miałbyś oczekiwać, że wypisze cały wiersz? Jakie wyniki otrzymujesz?

Odpowiedź

Ponieważ chcesz uzyskać dokładne dopasowanie, dlaczego nie użyć ==?

$ 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 

Możesz również ograniczyć dopasowanie za pomocą /^200$/:

$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1 

Edycja:

Wypróbowałem twoje polecenie i powinno działać. Czy na pewno -F " "?

Comm ents

  • Tak -F ' ' jest w porządku w mojej akcji. Nie ' nie wiem dlaczego, ale nadal mam ten sam problem

Odpowiedź

W przypadku awk wystarczy:

awk "$0~/ 200 /" file 

Lub sed (\s pasuje do dowolnej białej spacji):

sed -n "/\s200\s/p" file 

A grep solution (-P dla wyrażenia regularnego perl):

grep -P "\s200\s" file 

Jeśli ma być czysty bash:

while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file 

Jeśli nie masz pewności, czy są spacje, tabulatory, cokolwiek ([[:space:]] jest jak \s w powyższych rozwiązaniach sed i grep ):

while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file 

Komentarze

  • W grep będzie działać bez -P również, grep '\s200\s' file

Odpowiedź

Myślę, że tak s pomoże. Spowoduje to wydrukowanie tylko linii zawierającej wzorzec. W Twoim przypadku wzorzec to 200

grep "200" file-name 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *