아래와 같이 많은 열이 포함된 txt 파일이 있는데 두 번째 열 위치와 세 번째 열 위치 사이에 포함된 행을 가져와야 합니다.
1 10385389 10385390 . 21
1 10385390 10385391 . 22
1 10385391 10385392 . 22
1 10385392 10385393 . 21
1 10385393 10385394 . 22
1 10385394 10385395 . 25
1 10385395 10385396 . 25
1 10385396 10385397 . 25
1 10385397 10385398 . 25
1 10385398 10385399 . 25
이 예를 들어 10385391부터 10385397까지 원하는 출력을 선택한다고 가정해 보겠습니다.
1 10385391 10385392 . 22
1 10385392 10385393 . 21
1 10385393 10385394 . 22
1 10385394 10385395 . 25
1 10385395 10385396 . 25
1 10385396 10385397 . 25
보너스: 마찬가지로 중요한 점은 시작 위치를 찾을 수 없으면 대신 끝 위치를 찾는 것입니다. 제공된 예에서는 관련 시리즈가 있기 때문에 이런 일이 발생하지 않지만 다음과 같은 파일을 받는 경우
1 10385389 10385390 . 21
1 10385391 10385392 . 22
1 10385392 10385393 . 21
1 10385393 10385394 . 22
내가 피하고 싶은 오류는 사용자가 10385390을 입력했는데 두 번째 열에서 찾을 수 없다는 것입니다.
답변1
시작 및 중지 조건은 AWK에서 직접 처리할 수 있습니다.
awk '$2 == "10385391",$3 == "10385397"'
그러면 두 번째 필드 "10385391"이 있는 행으로 시작하고 세 번째 필드가 "10385397"이 있는 행으로 끝나는 모든 행이 출력됩니다.
보다 유연한 조건을 처리하기 위해 첫 번째와 두 번째 필드의 값이 10385391에서 10385397 사이인 행을 고려할 수 있습니다.
awk '$2 >= 10385391 && $3 <= 10385397'
입력에 일치하는 행의 여러 집합이 포함되어 있으면 모두 출력됩니다.
답변2
주문하다
awk '$2 == "10385391" { f=1 } $3 == "10385397" { f=0; print }; f' filename
10385391
두 번째 열을 살펴보고 f
발견되면 1로 설정합니다. 이렇게 하면 f
해당 행과 값이 1인 모든 행이 인쇄됩니다(이 작업은 코드 f
의 후행을 통해 수행됩니다 awk
). 세 번째 열에 도달할 때마다 10385397
더 f
많은 행을 인쇄하지 않도록 0으로 재설정되고 현재 행이 인쇄됩니다.
산출
1 10385391 10385392 . 22
1 10385392 10385393 . 21
1 10385393 10385394 . 22
1 10385394 10385395 . 25
1 10385395 10385396 . 25
1 10385396 10385397 . 25
답변3
awk -v begin=10385390 -v end=10385397 '($2 >= begin && $2 <= end) || ($3 >= begin && $3 <= end) || (begin <= $2 && end >= $3)' file
[$2,$3]
해당 범위가 지정된 범위와 겹치는 모든 행을 반환합니다 [begin,end]
.
지정된 데이터에 대해 다음이 반환됩니다.
1 10385389 10385390 . 21
1 10385390 10385391 . 22
1 10385391 10385392 . 22
1 10385392 10385393 . 21
1 10385393 10385394 . 22
1 10385394 10385395 . 25
1 10385395 10385396 . 25
1 10385396 10385397 . 25
1 10385397 10385398 . 25
[$2,$3]
범위 만 가져오세요~에주어진 [begin,end]
범위:
awk -v begin=10385390 -v end=10385397 '$2 >= begin && $3 <= end' file