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は各フィールドの名前を知っており、名前でアクセスできるようにするため、これが各レコードの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
ユーティリティが値をフィルタリングできず、切り捨てを選択しない限り、ここでは使用できません。みんな保持するデータが削除されるフィールドです。