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

时间:2015-01-27 13:28:16

标签: linux bash shell

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

       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秒等等。

1 个答案:

答案 0 :(得分:2)

这是一个疯狂的单行代表:

head -1 file; tail -n+2 file| nl| sort -nrk4| awk '{ ++m[$3]; print($1" "$2" "$3"p"m[$3]" "$4); }'| 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#数。{/ p>

附加说明:

  • 我从数据行(head -1)单独打印标题行(tail -n+2),因此主处理管道仅适用于数据行。

  • 我在初始nl之前添加了对sort的调用,以捕获新的前导编号列中的原始行顺序,然后按该列排序(然后{{1 }}编号列)返回原始订单。

  • 我在最后添加cut以对齐数据行,不知道您是否需要/需要。如果要将标题行与数据行对齐,可以使用支撑块围绕column -to' '语句和主管道,并将head过滤器移动到支撑块之外以对齐整个事物。 / p>