カットオフ値より高い列の特定の値のみを取得する方法

カットオフ値より高い列の特定の値のみを取得する方法

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_IdentitiesMillerは各フィールドの名前を知っており、名前でアクセスできるようにするため、これが各レコードの2番目(または10番目または他の)フィールドであることを知る必要はありません。

awkヘッダー行と他のすべての行(2番目のタブで区切られたフィールドが正確に80より大きい)を取得するには、次のようにします。

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

不思議なコードは、NR == 1 || $2 > 80現在の行が入力の最初の行であるか(NR == 1)、または2番目のフィールドの値が厳密に80より大きいか($2 > 80)を確認するブールテストです。テストが次の場合本物、現在のレコードを出力します。

$2実際のデータフィールドのインデックスに変更します。

これらのコマンドの出力を新しいファイル名に移動するには、.redirectを使用してコマンドを新しいファイル名にリダイレクトします>some_new_name

質問を次のようにマークしました。ただし、cutユーティリティが値をフィルタリングできず、切り捨てを選択しない限り、ここでは使用できません。みんな保持するデータが削除されるフィールドです。

おすすめ記事