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
이는 filter
Miller 작업을 사용하여 주어진 기준을 충족하지 않는 레코드를 삭제합니다.
Best_Identities
Miller는 각 필드의 이름을 알고 있으며 이름으로 액세스할 수 있도록 허용하므로 이것이 각 레코드의 두 번째(또는 열 번째 또는 기타) 필드인지 알 필요가 없습니다 .
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
유틸리티가 값을 필터링할 수 없고 자르기를 선택하지 않는 한 여기서는 사용할 수 없습니다 .모두유지하려는 데이터가 삭제되는 필드입니다.