我正在寻找一种方法,将下面的文件转换为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秒等等。
答案 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>