임계값보다 낮거나 높은 값을 가진 줄 삭제

임계값보다 낮거나 높은 값을 가진 줄 삭제

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

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


이 질문과 같은 특정 조건은 greptoo로 해결될 수 있습니다(아마도 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로 이동합니다 .next

답변3

이건 sed용이야

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

관련 정보