
내 파일은 다음과 같습니다.
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
too로 해결될 수 있습니다(아마도 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