임계값보다 낮은(또는 높은) 값을 가진 행 삭제

임계값보다 낮은(또는 높은) 값을 가진 행 삭제

내 파일은 다음과 같습니다.

AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
AA  112 C    2   ..  BB   3   ... BBB  0   D   F    0   D   F
AA  120 D    2   ..  FF   3   ... FFF  3   D   F    3   D   D

모든 열에 값 =< 10이 포함된 행을 삭제하고 싶습니다. 나는 sedand의 사용을 알고 있지만 awk '$3 !=< 10'이것은 세 번째 필드의 행만 삭제합니다. 모든 열을 고려하도록 qwk에 지시하는 방법이 있습니까?

답변1

perl구조하러 오세요

$ cat ip.txt 
AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
AA  112 C    2   ..  BB   3   ... BBB  0   D   F    0   D   F
AA  120 D    2   ..  FF   3   ... FFF  3   D   F    3   D   D

$ perl -ae 'print if !(grep { $_ <= 10 && /^\d+$/ } @F)' ip.txt 
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
  • -a입력 행을 공간적으로 분할하고 @F배열 에 저장
  • grep { $_ <= 10 && /^\d+$/ } @F@F숫자로만 구성된 배열을 가져오고 값은 다음과 같습니다.<= 10
  • 그런 다음 grep이 반환되면 해당 행을 인쇄합니다 0. around는 요소 자체가 아닌 일치 항목 수를 반환한다는 ()의미입니다 .grep

또 다른 조건을 테스트해 보겠습니다.

$ perl -ae 'print if !(grep { $_ < 10 && /^\d+$/ } @F)' ip.txt 
AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F


이 문제와 같은 일부 조건은 해결될 수도 있습니다 ( 해결 방법보다 빠를 grep수 있음 ).perl

$ grep -vw '[0-9]\|10' ip.txt 
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F

$ grep -vw '[0-9]' ip.txt 
AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
  • -v패턴 외부의 선 일치
  • -w전체 단어만 일치

답변2

에서는 행의 모든 ​​필드를 반복하는 것과 awk같은 기능을 사용할 수 있습니다 . for (i = 1 ; i <= NF ; i++) { ... }그처럼:

awk '{for(i = 1 ; i <= NF ; i++) { 
         if ($i ~ /^[0-9]+$/ && $i <= 10) { next };
       } 
     } 1'  < input

$i ~ /^[0-9]+$/필드가 숫자로만 되어 있는지 확인한 후 10과 비교하고 10보다 작거나 같으면 10레코드(행)로 이동합니다.next

답변3

이것은 sed용입니다.

sed -rn '/\b([0-9]|10)\b/!p' file

관련 정보