Mam ten plik:
names average
john:15.02
Mark:09.63
James:12.58
Chcę wyodrębnić z niego tylko średnie większe niż 10, więc wynik w tym przykładzie powinien wynosić:
15.02
12.58
Mam ten plik:
names average
john:15.02
Mark:09.63
James:12.58
Chcę wyodrębnić z niego tylko średnie większe niż 10, więc wynik w tym przykładzie powinien wynosić:
15.02
12.58
Odpowiedzi:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- ustawia F
separator pola na:
{if($2>10)print$2}
- dla każdej linii sprawdź, czy 2
pole nd jest >10
, jeśli tak, print
to<filename
- pozwól powłoce otworzyć plik filename
, co jest lepsze niż pozwalanie awk
na to, zobacz odpowiedź Stéphane Chazelas na ten temat$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58
Możliwe jest również dodawanie spacji i umieszczanie wzoru poza nawiasami, więc są one równe - dzięki Stefanowi za zwrócenie na to uwagi:
awk -F: '{if($2>10)print$2}' <filename
awk -F: '{ if ( $2 > 10 ) print $2 }' <filename
awk -F: '$2>10{print$2}' <filename
awk -F: '$2 > 10 { print $2 }' <filename
[[ $0 > 10 ]]
jako leksykalne porównanie - i w każdym razie nie jest zbyt pomocny dla wartości niecałkowitych
Z grep będziesz musiał pracować z wyrażeniami regularnymi; na przykład
grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2
jak w przypadku sed:
sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file
Ale używanie RegEx na zamówionych danych jest podatne na błędy (z mojego doświadczenia) i trudne do odczytania ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
i sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file
. Warto wspomnieć, że działa to tylko z> 1,> 10,> 100 itd., Np.> 20 byłoby niemożliwe.
':[1-9][0-9]\+\.\?'
- dosłowną kropką dziesiętną \. jest opcjonalny i dopasowywany co najwyżej \ ?. (@dessert dziękuję za wskazanie ograniczenia mojej RegEx.)