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ですがグループを追加します)。