範囲が定義されたグループID

範囲が定義されたグループID

IDと数字(位置)を含むソートされたファイルがあります。 2番目の列の位置を500間隔のグループにグループ化する必要があります。

この行の値が前の行と比較して500未満の場合は同じグループに配置し、この行の値が500より大きい場合は別のグループに配置します。

入力ファイル:

snp00001    200
snp00002    300
snp00003    400
snp00004    500
snp00005    600
snp00006    900
snp00007    1500
snp00008    1800
snp00009    3000
snp00010    3500
snp00011    4000
snp00012    5000

希望の出力

snp00001 200 Group1
snp00002 300 Group1
snp00003 400 Group1
snp00004 500 Group1
snp00005 600 Group1
snp00006 900 Group1
snp00007 1500 Group2
snp00008 1800 Group2
snp00009 3000 Group3
snp00010 3500 Group3
snp00011 4000 Group4
snp00012 5000 Group5

追加の注意:snp00001 - snp00006は(snp00002 - snp00001)または(snp00003 - snp00002)または(snp00004 - snp00003)...の範囲が500未満であるため、同じグループ

snp00006とsnp00007は、次のグループにグループ化されています。

私はawkを試しましたが、成功しませんでした。

awk -v step=500 -v OFS='\t' '{if(NR==1 || $2+limit){group++} file="Group"group; print file,$0}' input_file

ベストアンサー1

以前の値を追跡し、現在の値を保存された値と比較する必要があります。差が500を超える場合は、グループ数を増やしてください。

例えば

awk -v group=1 '{if ($2-prev>500) { group++ }} {prev=$2; $3="group" group; print}'
snp00001 200 group1
snp00002 300 group1
snp00003 400 group1
snp00004 500 group1
snp00005 600 group1
snp00006 900 group1
snp00007 1500 group2
snp00008 1800 group2
snp00009 3000 group3
snp00010 3500 group3
snp00011 4000 group3
snp00012 5000 group4

(FWIW、9/10/11出力は一貫性がありません。9 - > 10は500ですがグループを追加しませんが、10 - > 11も500ですがグループを追加します)。

おすすめ記事