次のデータフレームの例があります。 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番目のフィールドのみを考慮し、見つかった最初のフィールドを維持し、残りのフィールドを削除して一意性を保証します。