Text-Processing

具有定義範圍的組 ID

  • April 20, 2022

我有一個排序的 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 但確實增加組)。

引用自:https://unix.stackexchange.com/questions/699630