내 파일은 다음과 같습니다.
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이 포함된 행을 삭제하고 싶습니다. 나는 sed
and의 사용을 알고 있지만 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