필드 값이 3-sed 또는 awk 이하인 줄을 제거 하시겠습니까?


17

8 번째 필드 (열)에서 값이 2 이하인 모든 줄을 제거해야합니다.

내 데이터는 다음과 같습니다

12-31   Airport 189 379 41  49.70946503 -124.91377258   2   2880    30.8
01-01   AlberniElementary   165 331 16  49.26100922 -124.80662537   4   5760    26.1
01-09   BamfieldMarine  161 323 23  48.83490372 -125.13572693   2   2875    27.4
01-10   BamfieldMarine  161 323 23  48.83490372 -125.13572693   3   3068    38.6

awk를 사용하여 원하는 값을 제거하고 다른 파일로 인쇄 할 수 있으며 sed가 현재 파일을 편집한다는 것을 이해합니다. 두 경우 모두 원본 파일을 유지해야합니다.

참고 : 솔루션에 대한 자세한 설명을 제공하십시오. 명령을 작성하는 것만으로는 충분하지 않으므로 제안 사항에 주석을 달아주십시오.

추가 참고 사항 : 데이터에는 헤더 행이 있으므로 대부분의 솔루션은

awk 'FNR> 1'

나는 생각합니까?

답변:


19

당신은 거의 그것을 얻었다.

 awk '(NR>1) && ($8 > 2 ) ' foo > bar

어디

  • NR 레코드 수 (행 수)
  • $8 여덟 필드입니다
  • && 논리적이고
  • foo 변경되지 않은 원본 파일입니다.
  • bar 결과 파일
  • 암시 적 기본 동작은 현재 입력 라인을 인쇄하는 것입니다

헤더는 foo에서 bar로 스트라이프되어 유지됩니다.

 awk '(NR==1) || ($8 > 2 ) ' foo > bar

어디

  • || 논리적이거나
  • NR == 1 또는 $ 8> 2 인 경우 입력 라인이 인쇄됩니다.

업데이트 # 1

범위를 지정하려면

  • ( ($8 >= -4) && ( $8 <= 4 ) ) -4에서 4까지 8 번째 필드
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) 헤더를 포함하여 동일

좋은 답변 : 간단하면서도 철저한 감사합니다. 그래서 분명합니다.이 경우 FNR과 NR의 차이는 아무것도 아닙니다. 나는 현재 페이지의 NR 서수와 현재 파일의 현재 레코드의 서수를 설명 하는 매뉴얼 페이지를 읽었습니다 . 그래서 나는이 경우에 이것들이 동등하다는 것을 이해합니다. :)
geokrowding

파일이 하나 인 경우 FNR은 항상 NR입니다. file1에 10 줄이 있으면 file2의 첫 번째 줄은 NR = 11이고 FNR = 1입니다.
Archemar

안녕하세요, 비슷한 일을하고 싶지만 -4에서 4 사이의 모든 것을 받아들이십시오.이 작업을 수행하는 방법은 현재 awk '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles

1
awk는 수학 스타일 범위를 알지 못합니다. 편집 내용을 참조하십시오.
Archemar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.