Bash 做一本字典。。。某种程度上
我在一个以制表符分隔的文件中有以下一组值(此处仅显示部分值…文件有2列) 由于CCNL2的明显值出现了4次,我想要的是,只有列1中重复名称的最高值应该被提取并放入另一个文件中 像这样的Bash 做一本字典。。。某种程度上,bash,shell,Bash,Shell,我在一个以制表符分隔的文件中有以下一组值(此处仅显示部分值…文件有2列) 由于CCNL2的明显值出现了4次,我想要的是,只有列1中重复名称的最高值应该被提取并放入另一个文件中 像这样的 MXRA8 9.9074e-08 AURKAIP1 0.0000e+00 CCNL2 2.5311e-07 LOC148413 2.2558e-07 MRPL20 0.0000e+00 LOC441869 0.0000e+00 TMEM88B 0.0000e+00 对bas
MXRA8 9.9074e-08
AURKAIP1 0.0000e+00
CCNL2 2.5311e-07
LOC148413 2.2558e-07
MRPL20 0.0000e+00
LOC441869 0.0000e+00
TMEM88B 0.0000e+00
对bashshell脚本的任何建议
或者PERL中的一行程序试试:
awk -F '\t' 'BEGIN { } { if (max[$1] == "" || $2 > max[$1]){ max[$1] = $2 } } END { for (var in max) { print var,"\t",max[var] } } ' tab-limited-data-file
这将打印出第一列中每个值的最大值。尝试:
awk -F '\t' 'BEGIN { } { if (max[$1] == "" || $2 > max[$1]){ max[$1] = $2 } } END { for (var in max) { print var,"\t",max[var] } } ' tab-limited-data-file
这将打印出第一列中每个值的最大值。根据排序手册页判断,它使用数字排序处理浮点值,但您可能需要对其进行测试:
sort --key=2 --general-numeric-sort --reverse input.txt | sort --key=1,1 --unique
AURKAIP1 0.0000e+00
CCNL2 2.5311e-07
LOC148413 2.2558e-07
LOC441869 0.0000e+00
MRPL20 0.0000e+00
MXRA8 9.9074e-08
TMEM88B 0.0000e+00
从排序手册页判断,它使用数字排序处理浮点值,但您可能希望对此进行测试:
sort --key=2 --general-numeric-sort --reverse input.txt | sort --key=1,1 --unique
AURKAIP1 0.0000e+00
CCNL2 2.5311e-07
LOC148413 2.2558e-07
LOC441869 0.0000e+00
MRPL20 0.0000e+00
MXRA8 9.9074e-08
TMEM88B 0.0000e+00
您可以先排序,然后使用awk逐行读取文件,只保留最大行。如果重复的行始终按照示例输入中的方式分组,则可以避免排序
sort file | awk -F '\t' 'NR==1{last = $1; max = 0} {if (last != $1) {printf "%s\t%e\n", last, max; last = $1; max = $2} else if (max < $2) max = $2} END{printf "%s\t%e\n", last, max}'
排序文件| awk-F'\t''NR==1{last=$1;max=0}{if(last!=$1){printf“%s\t%e\n”,last,max;last=$1;max=$2}否则如果(max<$2)max=$2}END{printf“%s\t%e\n”,last,max}
您可以先排序,然后使用awk逐行读取文件,只保留最大行。如果重复的行始终按照示例输入中的方式分组,则可以避免排序
sort file | awk -F '\t' 'NR==1{last = $1; max = 0} {if (last != $1) {printf "%s\t%e\n", last, max; last = $1; max = $2} else if (max < $2) max = $2} END{printf "%s\t%e\n", last, max}'
排序文件| awk-F'\t''NR==1{last=$1;max=0}{if(last!=$1){printf“%s\t%e\n”,last,max;last=$1;max=$2}否则如果(max<$2)max=$2}END{printf“%s\t%e\n”,last,max}
没有简单的shell脚本会解释python,perl所需的浮点数。没有简单的shell脚本会解释python,perl所需的浮点数。谢谢Arun。来自印度的哪个地区?除了无用的使用cat
,将为+1。为什么不awk。。。文件
(保存管道)而不是cat文件| awk
?@jw013:我有时也会在sed/awk面前用cat写我的答案。这表明输入不需要来自文件。来自印度的哪个地区?除了无用的使用cat
,将为+1。为什么不awk。。。文件
(保存管道)而不是cat文件| awk
?@jw013:我有时也会在sed/awk面前用cat写我的答案。这表明输入不需要来自文件。这很有趣。未经测试就接受了答案。嗯,它不能解释浮点值,至少在这里不能。是的,经过更仔细的检查,我发现了它(@jw013-没错,我在测试时犯了一个错误。sort-g
对浮点数的排序比我好。:-)嗯,也很好奇。我的排序(GNU版本8.5)明确表示,它的-n
选项不排序前导+
或指数表示法。你有什么版本的排序?我有GNU排序v8.5-n
似乎不处理+x
表达式,而-g
处理echo-e“3.14e-2\n3.15e-5”| sort-g
vsecho-e“3.14e-2\n3.15e-5”| sort-n
也说明了区别。这很有趣。未经测试就接受了答案。嗯,它不能解释浮点值,至少在这里不能。是的,经过更仔细的检查,我发现了它(@jw013-没错,我在测试时犯了一个错误。sort-g
对浮点数的排序比我好。:-)嗯,也很好奇。我的排序(GNU版本8.5)明确表示,它的-n
选项不排序前导+
或指数表示法。你有什么版本的排序?我有GNU排序v8.5-n
似乎不处理+x
表达式,而-g
处理echo-e“3.14e-2\n3.15e-5”| sort-g
vsecho-e“3.14e-2\n3.15e-5”| sort-n
也说明了区别。如果我还有两列数据,我想做同样的事情,但基于第4列中的值。如果我还有两列数据,我想做同样的事情,但基于第4列中的值怎么办。