Mam następujący plik
200.000 1.353 0.086
200.250 1.417 0.000
200.500 1.359 0.091
200.750 1.423 0.000
201.000 1.365 0.093
201.250 1.427 0.000
201.500 1.373 0.093
201.750 1.432 0.000
202.000 1.383 0.091
202.250 1.435 0.000
202.500 1.392 0.087
202.750 1.436 0.000
203.000 1.402 0.081
203.250 1.437 0.001
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045
Chciałbym grepować tylko wiersze, które mają w pierwszej kolumnie tylko dziesiętne .000 i .500, więc wynik będzie taki:
200.000 1.353 0.086
200.500 1.359 0.091
201.000 1.365 0.093
201.500 1.373 0.093
202.000 1.383 0.091
202.500 1.392 0.087
203.000 1.402 0.081
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045
Odpowiedzi:
Nie używasz grep. Zastosowanie
awk
.źródło
awk '$1 ~ /\.[05]0*$/'
.awk '$1 ~ /\.[05]00$/'
sobie (wymagam dokładnie trzech cyfr), chyba że miałbym powód, by sądzić, że na wejściu spodziewane są zmienne miejsca dziesiętne.echo 0.5001 | awk '$1 ~ /\.[05]00/'
. Działa niezawodnie tylko wtedy, gdy są dokładnie trzy.Pierwsza kolumna
$1
zostanie dopasowana/\.500|\.000/
do kropek, które są znakami ucieczki, aby były dosłowne kropki, nie regexuj żadnego znaku, który~
jest częściowo dopasowany, i wypisz całą linię$0
źródło
{ print $0 }
; jest to domyślna akcja Awk.Moja pierwsza myśl
Szybki test przy użyciu WSL
Można to wyrazić w bardziej zwięzły sposób.
Jeśli pierwsza kolumna może mieć inną niż 3-cyfrową część całkowitą
W niektórych okolicznościach może być konieczne użycie
[:digit:]
zamiast[0-9]
.I tak dalej.
man grep
jest twoim przyjacielem.źródło
grep
jest łatwiejsze w użyciu niż moje. Nie opublikowałbym odpowiedzi, gdybym to pierwszy raz zobaczył. Dobra robota!W zależności od przypadku użycia możesz również użyć rzeczywistych operacji numerycznych:
Testowane z BSD awk (OSX El Capitan, 20070501) i GNU awk 4.1.4.
źródło
źródło
Z
awk
:Z
mlr
:źródło
Ok, trochę późno dodając swój wkład, ale myślę, że warto.
Wymóg spełnienia w odniesieniu do PO jest pierwszą kolumną mającą wartość dziesiętną
.000
lub.500
tylko. Nie ma ograniczeń co do wiodącej wartości, ani według zakresu, ani długości. Aby zapewnić niezawodność, nie należy zakładać, że jest ograniczany przez cokolwiek poza tym, że przed pierwszą kolumną (lub nie jest to już pierwsza kolumna) nie ma niepustych znaków, a zawartość pierwszej kolumny będzie miała kropkę dziesiętną.
, gdzieś w tym.OP chce użyć
grep
, który wypisze całą linię po znalezieniu dopasowania, więc jedyne, co można zrobić, to stworzyć wzór, który pasuje do wszystkich i tylko tego, co jest wymagane.Prostota sama w sobie, i nie ma powodu, aby używać
sed
lubawk
jako `grep, może obsłużyć źródło jako plik lub potok.Do
grep
pliku użyjgrep '^[^.]*\.[05]0\{2\}\s' the_file.txt
Do
grep
z potoku użyjmy_command | grep '^[^.]*\.[05]0\{2\}\s'
Wzór jest następujący:,
^
zacznij od początku linii;[^.]
, dopasuj dowolny znak nie dziesiętny;*
, tyle razy, ile to możliwe (w tym żaden);\.
, dopasuj przecinek dziesiętny;[05]
, dopasuj pięć lub zero;0\{2\}
, dopasuj jeszcze 2 zera (odwrotne ukośniki przed otwieraniem i zamykaniem klamry uniemożliwiają powłoce próby rozszerzenia nawiasu klamrowego);\s
, dopasuj biały znak (oznaczający koniec kolumny - aby użyć w innym przypadku użycia, zamień na separator kolumny, zwykle na przecinek, średnik lub tabulator\t
).Zauważ, że będzie to dokładnie zgodne z żądaniem OP. To będzie nie pasuje
.5000
lub.0000
chociaż numerycznie równoważne, ponieważ wygląda wzór dla pięciu lub zero, a następnie dokładnie 2 więcej zer następnie spacji. Jeśli jest to znaczące, wówczas wszystkie inne odpowiedzi, jak dotąd, zawodzą, ponieważ będą pasować do dowolnej liczby zer, większej niż 1, za cyfrą testową. I z wyjątkiem odpowiedzi FloHimself, dopasują wszystko w drugiej kolumnie, która się zaczyna.000
lub.500
, włączając.0003
i.500T
, a ta przez FloHimself dopasuje wszystko, co jest matematycznie równoważne.0
i.5
, bez względu na liczbę zer. Ten ostatni, choć niezgodny z tym, co stwierdził PO, prawdopodobnie i tak odpowiada temu, czego potrzebuje PO.Wreszcie, jeśli
awk
pożądana jest moc i prędkość, nawet jeśli poprosił o to OPgrep
, wówczas polecenie brzmiałoby:Z plikiem
awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt
Z rurką
my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'
źródło
Jeśli nalegasz na użycie grep, może to działać dla ciebie. Zapisałem pierwsze dane wyjściowe w pliku tekstowym o nazwie „file.txt”, a następnie użyłem następującego polecenia:
grep -e '2[^ ]*.000' file.txt & grep -e '2[^ ]*.500' file.txt
Co daje wynik:
Nie musisz zapisywać wyniku w pliku tekstowym, jeśli jest już w pliku. Ale w przypadku, gdy nie jest on zapisywany w pliku, możesz również potokować dane do podanego polecenia grep i powinno ono działać przynajmniej do pierwszej liczby
2
, w pierwszej kolumnie nie jest już a2
. W tym momencie musisz zaktualizować polecenie grep odpowiednim znakiem, aby drukować poprawnie.To podwójne
grep
polecenie polega na tym, że pierwszegrep
jest wysyłane do&
operatora w tle . Gdy jest wysyłane do tła, następnegrep
polecenie jest wykonywane natychmiast po tym, zapewniając jednolity wynik. Aby zadanie, które musisz wykonać, było łatwiejsze do wykonania, powinieneś podążać za przykładem podanym przez innych, aawk
nawet z niego skorzystaćsed
.(edytować)
To nie jest najlepsze lub najskuteczniejsze użycie grepa dla twoich potrzeb, ale powinno wystarczyć, abyś trochę się pobawił i lepiej poczuł grep.
źródło
.500
i.000
od pierwszej kolumnie. Jeśli to konieczne, w określonej kolejności, od najmniejszej do największej, można to łatwo zrobić. Jednak pierwsze 3 cyfry pierwszych drukowanych kolumn są co najmniej w największej kolejności. To wynik2[^ ]*.000
i2[^ ]*.500
. To całkiem pasuje do tego, o co poprosił PO.