Text-Processing
具有定義範圍的組 ID
我有一個排序的 ID 和數字(位置)文件。我需要將第二列中的位置分組為一組 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 被分到下一組,因為它們之間的範圍(snp00007 - snp00006)超過 500。
我試過用awk,但沒有成功。
awk -v step=500 -v OFS='\t' '{if(NR==1 || $2+limit){group++} file="Group"group; print file,$0}' input_file
您需要跟踪以前的值並將目前值與保存的值進行比較。如果差值超過 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 但確實增加組)。