파일에서 임계 값보다 큰 값만 추출하는 방법은 무엇입니까?


10

이 파일이 있습니다 :

names average
john:15.02
Mark:09.63
James:12.58

평균에서 10보다 큰 평균 만 추출하려고 하므로이 예제의 출력은 다음과 같아야합니다.

15.02
12.58

답변:


19

awk

awk -F: '{if($2>10)print$2}' <filename

설명

  • -F:F필드 구분 기호를:
  • {if($2>10)print$2}– 각 행에 대해 2nd 필드가 >10인 경우 테스트 print하십시오.
  • <filename– 쉘이 파일을 열어 보도록하라. 그렇게하는 filename것보다 낫다 . 주제에 대한 Stéphane Chazelas의 답변을awk 보라.

예제 실행

$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58

공백을 추가하고 패턴을 괄호 외부에 넣을 수도 있습니다. 따라서 Stefan은이 를 지적합니다.

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

귀하의 도움, 완벽한 솔루션에 대해 대단히 감사합니다.이 상황에서 'cut'및 'grep'(기본 명령) 명령 만 사용하여 10보다 우수한 파일에서만 표시 할 수 있습니다.
Haikel Fazzani

나는 모든 당신의 노력을 주셔서 감사합니다, 도움을 너무 많이 주셔서 감사합니다, UR 솔루션을 완벽하게 이해 ..
Haikel Fazzani

치료 것이다 배쉬 잊지 마세요 [[ $0 > 10 ]]어휘 비교를 - 그리고 어떤 경우에, 많은 비 정수 값에 도움이되지 않습니다
steeldriver는

@dessert : 개인적으로 액션 문장 앞에 패턴을 넣는 것을 선호합니다. .
Stefan

3

grep을 사용하면 정규식을 사용해야합니다. 예 :

grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2

sed와 마찬가지로 :

sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file

그러나 정렬 된 데이터에 RegEx를 사용하면 오류가 발생하기 쉽고 (내 경험으로는) 읽기가 어렵습니다 ;-).


매우 영리한! grep ':[1-9][0-9]\+\.' <file | cut -d: -f2및 로 단축 할 수 있습니다 sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. 이것이> 1,> 10,> 100 등에서 만 작동한다는 점은 언급 할 가치가 있습니다. 예를 들어> 20은 불가능합니다.
디저트

내 RegEx에서 버그를 발견했습니다 : 소수점이없는 숫자의 경우 RegEx는 다음과 같아야합니다 ':[1-9][0-9]\+\.\?'.-리터럴 소수점 \. 선택 사항이며 최대 \\와 일치합니다. (RegEx의 제한 사항을 지적 해 주셔서 감사합니다.)
Stefan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.