Linux 重命名第一列以区分startsites脚本
我正在寻找一种方法来转换文件,如下所示,称为输入到输出。文件输入由包含唯一ID、ID和值的列组成。我想根据作为区分的值将ID转换为单独的ID。我尝试了一些基本命令,但无法使其适用于主输入文件,该文件有20000行和15000个ID。 有没有人对如何处理这个问题有一些好的想法/建议Linux 重命名第一列以区分startsites脚本,linux,bash,shell,Linux,Bash,Shell,我正在寻找一种方法来转换文件,如下所示,称为输入到输出。文件输入由包含唯一ID、ID和值的列组成。我想根据作为区分的值将ID转换为单独的ID。我尝试了一些基本命令,但无法使其适用于主输入文件,该文件有20000行和15000个ID。 有没有人对如何处理这个问题有一些好的想法/建议 INPUT OUTPUT unique ID VALUE unique ID VALUE A1 GENEA 10 -> A1
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的值第二高,等等。这里有一个疯狂的单行程序:
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
它包括按值
列对文件进行排序,然后在awk
中按顺序对其进行处理,在关联数组中计算每个不同的ID
的出现次数,这样您就可以建立p#
计数
补充说明:
- 我将标题行(
)与数据行(head-1
)分开打印,因此主处理管道将仅应用于数据行tail-n+2
- 我在初始的
之前添加了对排序
的调用,以捕获新的前导编号列中的原始行顺序,然后按该列排序(然后nl
剪切该编号列)以返回原始顺序
- 我在末尾将
以对齐数据行,不知道您是否需要。如果要将标题行与数据行对齐,可以将列-添加到“”
语句和主管道用大括号括起来,并将head
过滤器以对齐整个内容列移动到带大括号的块外的“
ID
列值之后粘贴p#
(每个ID都有连续的数字)?哦,对不起,忘了提及我希望它们根据值排序。其中p1的值最高,p2的值第二高,等等。哇,那些单行程序太棒了!我删除了“column-to”“;”,因为我遇到了错误:column:invalid选项--“o”用法:column[-tx][c columns][s sep][file…]
但是如果没有它,它也可以正常工作!