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

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

次のデータフレームの例があります。 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。元のファイルの順序は `いいえ維持する。

答え2

すべてのソートとawkを使用してください。

$ sort -rnk5,5 file | awk '!seen[$3]++'
A00643:620:HFM7YDSX5:1:1150:15628:12743 CCTATCGTCGCTGGAATTCCCCGGG       AGCCCGGGG       1458266 49      Bordetella
A00643:620:HFM7YDSX5:1:2476:4001:29496  ATTCACCCTATAGGAGCCCGGGGCA       TGCCCCGGG       1458266 0       Bordetella
A00643:620:HFM7YDSX5:1:2124:8865:2472   ATCAGCCCGGGGCTTGGGCTAGGAC       GGGTGTGTG       548476  0       Corynebacterium
A00643:620:HFM7YDSX5:1:1450:4001:4507   GGCGATCGAAATGTCAAGCCCGGGG       TCTTGTGGT       585529  0       Corynebacterium

またはawkのみを使用してください:

$ awk '
    !($3 in max) || ($5 > max[$3]) { max[$3]=$5; line[$3]=$0 }
    END { for (key in max) print line[key] }
' file
A00643:620:HFM7YDSX5:1:2476:4001:29496  ATTCACCCTATAGGAGCCCGGGGCA       TGCCCCGGG       1458266 0       Bordetella
A00643:620:HFM7YDSX5:1:1150:15628:12743 CCTATCGTCGCTGGAATTCCCCGGG       AGCCCGGGG       1458266 49      Bordetella
A00643:620:HFM7YDSX5:1:2124:8865:2472   ATCAGCCCGGGGCTTGGGCTAGGAC       GGGTGTGTG       548476  0       Corynebacterium
A00643:620:HFM7YDSX5:1:1450:4001:4507   GGCGATCGAAATGTCAAGCCCGGGG       TCTTGTGGT       585529  0       Corynebacterium

どの値も基準にせず、最初の設定を使用して初期化するため、!($3 in max)最大値が0または負の場合でも機能します。最小/最大計算の経験則は、常にゼロまたは他の任意の値ではなく、最初の読み取り値で初期化することです。max[$3]$3$5

すべてのフィールドが常に存在すると言われ、最初の5つのフィールドには空白があってはならないと言われたため、FSをタブに設定する必要はありません。

答え3

ただ使用してくださいsort

sort -k3,3 -k5,5nr /tmp/my_acgt_file | sort -k3,3 -u

左側はファイルを3番目のフィールド(最も低いものから)にソートし、同じ場合は5番目のフィールド(最も高いものから)にソートします。

右側は(ソートされた)3番目のフィールドのみを考慮し、見つかった最初のフィールドを維持し、残りのフィールドを削除して一意性を保証します。

関連情報