重命名第一列以区分 startsites 脚本

Renaming first column to distinguish between startsites script

我正在寻找一种将文件转换为 INPUT 的方法,如下所示。文件 INPUT 由包含唯一 ID、ID 和值的列组成。我想根据作为区别的值将 ID 转换为分隔的 ID。我尝试了一些基本命令,但无法使其适用于 20,000 行和 15,000 个 ID 的主输入文件。 有没有人有一些好的ideas/suggestions如何处理这个问题?

       INPUT                OUTPUT      
unique  ID  VALUE       unique  ID  VALUE
A1  GENEA   10  ->  A1  GENEAp1 10
A2  GENEA   5   ->  A2  GENEAp2 5
A3  GENEA   2   ->  A3  GENEAp3 2
A4  GENEB   4   ->  A4  GENEBp4 4
A5  GENEB   5   ->  A5  GENEBp3 5
A6  GENEB   8   ->  A6  GENEBp2 8
A7  GENEB   70  ->  A7  GENEBp1 70
A8  GENEC   5   ->  A8  GENECp1 5
A9  GENED   50  ->  A9  GENEDp2 50
A10 GENED   10  ->  A10 GENEDp3 10

最好根据值对p进行编号。 p1 具有最高值,p2 第二高等

这是一个疯狂的 one-liner:

head -1 file; tail -n+2 file| nl| sort -nrk4| awk '{ ++m[]; print(" "" ""p"m[]" "); }'| sort -n| cut -d' ' -f2-4| column -to' ';

输出:

unique  ID  VALUE
A1  GENEAp1 10
A2  GENEAp2 5
A3  GENEAp3 2
A4  GENEBp4 4
A5  GENEBp3 5
A6  GENEBp2 8
A7  GENEBp1 70
A8  GENECp1 5
A9  GENEDp1 50
A10 GENEDp2 10

它涉及按 VALUE 列对文件进行排序,然后在 awk 中按顺序处理它,计算关联数组中每个不同 ID 的出现次数,因此您可以构建增加 p# 计数。

补充说明:

  • 我将 header 行 (head -1) 与数据行 (tail -n+2) 分开打印,因此主处理管道仅适用于数据行.

  • 我在初始 sort 之前添加了对 nl 的调用,以在新的前导编号列中捕获原始行顺序,然后按该列排序(和然后 cut 出那个编号列)到 return 到原始顺序。

  • 我在最后加了column -to' '对齐数据线,不知道你是不是want/need。如果要将 header 行与数据行对齐,可以用大括号将 head 语句和主管道包围起来,并将 column -to' ' 过滤器移到大括号外以对齐整件事。