他の列の値に基づいて重複項目をフィルタリングする

他の列の値に基づいて重複項目をフィルタリングする

次のデータフレームの例があります。 3番目の列の要素を繰り返すことができます。 5列に最も高い値を持つ項目を維持したいと思います。

~の意味AGCCCGGGG2番目の項目である5番目の列の値が49であることを維持したいと思います。

A00643:620:HFM7YDSX5:1:1124:7120:12352  ATCAGCCCGGGGCTTGGGCTAGGAC   GGGTGTGTG   548476  0   Corynebacterium
A00643:620:HFM7YDSX5:1:1150:15953:12524 CCTATCGTCGCTGGAATTCCCCGGG   AGCCCGGGG   1458266 1   Bordetella
A00643:620:HFM7YDSX5:1:1150:15628:12743 CCTATCGTCGCTGGAATTCCCCGGG   AGCCCGGGG   1458266 49  Bordetella
A00643:620:HFM7YDSX5:1:1450:4001:4507   GGCGATCGAAATGTCAAGCCCGGGG   TCTTGTGGT   585529  0   Corynebacterium
A00643:620:HFM7YDSX5:1:2124:8865:2472   ATCAGCCCGGGGCTTGGGCTAGGAC   GGGTGTGTG   548476  0   Corynebacterium
A00643:620:HFM7YDSX5:1:2476:4001:29496  ATTCACCCTATAGGAGCCCGGGGCA   TGCCCCGGG   1458266 0   Bordetella

ベストアンサー1

awk便利なツールは次のとおりです。

awk -F'\t' 'l[$3] {if ($5>n[$3]) {n[$3]=$5; l[$3]=$0} ; next} 
            {n[$3]=$5 ; l[$3]=$0}
            END { for (i in l) {print l[i]}}' infile

-F'\t'- タブ文字をフィールド区切り文字として使用

2行目から始めましょう。n[$3]=$5列 5 の数字を列 3 で索引付けされた配列に保存しn、行全体をl同じ索引で索引付けされた配列に保存します。ただし、これは次の理由で列3に固有の値が最初に表示されたときにのみ発生します。

l[$3] {...}l中括弧で囲まれたコマンドは、インデックス(= 3列)の要素が配列$3にある場合にのみ実行されます。この場合、保存された値はn列5と比較され、必要に応じて更新されます。next方法次のレコードに移動つまり、ファイルの行です。

END- 配列を繰り返しl$3一意で(最初の)最も高い値を持つすべての行を返します$5。元のファイルの順序は `いいえ維持する。

おすすめ記事