txt 파일에서 서로 다른 열의 두 특정 값 사이에 행 가져오기 [닫기]

txt 파일에서 서로 다른 열의 두 특정 값 사이에 행 가져오기 [닫기]

아래와 같이 많은 열이 포함된 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). 세 번째 열에 도달할 때마다 10385397f많은 행을 인쇄하지 않도록 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

관련 정보