컷오프 값보다 높은 열의 특정 값만 가져오는 방법

컷오프 값보다 높은 열의 특정 값만 가져오는 방법

12개의 열이 있는 파일이 있습니다. 10열에는 0~100 범위의 값이 있습니다. 하지만 80보다 큰 값만 필요합니다. 나머지는 필터링하고 싶습니다. 어떤 명령을 사용해야 하는지 알 수 있나요?

예,

|Best_Hit_ARO|      |Best_Identities|
|------------|      |---------------|
|OXA-900     |      |      97.78    |
|qacJ        |      |      39.62    |
|adeF        |      |      67.78    |

따라서 이 예에서처럼 Best-identities가 10번째 열인 경우 80보다 큰 값만 유지하려면 어떻게 해야 할까요? 이 경우에는 97.78만 유지합니다.

PS 이것은 .tsv 파일이고 결과를 new-file.tsv에 저장하고 싶습니다. 저는 여러분이 쉽게 시각화할 수 있도록 여기에 이 ​​표를 만들었습니다. 그렇지 않으면 tsv 파일입니다.

답변1

파일이 탭으로 구분되어 있고 질문에 표시된 헤더를 포함한다고 가정합니다.

$ cat file
Best_Hit_ARO    Best_Identities
OXA-900 97.78
qacJ    39.62
adeF    67.78

그런 다음 예를 들어 사용할 수 있습니다.밀러( ) 아래와 같이 필드가 80보다 큰 레코드를 mlr필터링(추출)합니다 .Best_Identities

$ mlr --tsv filter '$Best_Identities > 80' file
Best_Hit_ARO    Best_Identities
OXA-900 97.78

이는 filterMiller 작업을 사용하여 주어진 기준을 충족하지 않는 레코드를 삭제합니다.

Best_IdentitiesMiller는 각 필드의 이름을 알고 있으며 이름으로 액세스할 수 있도록 허용하므로 이것이 각 레코드의 두 번째(또는 열 번째 또는 기타) 필드인지 알 필요가 없습니다 .

awk머리글 행과 다른 모든 행(두 번째 탭으로 구분된 필드가 정확히 80보다 큼)을 가져오려면 다음과 같이 수행할 수 있습니다 .

$ awk -F '\t' 'NR == 1 || $2 > 80' file
Best_Hit_ARO    Best_Identities
OXA-900 97.78

신비한 코드는 NR == 1 || $2 > 80현재 행이 입력의 첫 번째 행인지( NR == 1) 또는 두 번째 필드의 값이 엄격하게 80보다 큰지( $2 > 80) 확인하는 부울 테스트입니다. 테스트가 다음과 같은 경우진짜, 현재 레코드를 출력합니다.

$2실제 데이터 필드에 있는 인덱스로 변경합니다 .

이러한 명령의 출력을 새 파일 이름으로 이동하려면 .redirect를 사용하여 명령을 새 파일 이름으로 리디렉션하세요 >some_new_name.

질문을 다음과 같이 표시했습니다.하지만 cut유틸리티가 값을 필터링할 수 없고 자르기를 선택하지 않는 한 여기서는 사용할 수 없습니다 .모두유지하려는 데이터가 삭제되는 필드입니다.

관련 정보