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
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
awk
wydrukuje pojedyncza linia? Czy w ogóle zadałeś sobie trud zrozumienia, co to ma zrobić?200
; ii) pierwsze pole i iii) przedostatnie pole. Dlaczego miałbyś oczekiwać, że wypisze cały wiersz? Jakie wyniki otrzymujesz?