Bash 做一本字典。。。某种程度上

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

我在一个以制表符分隔的文件中有以下一组值(此处仅显示部分值…文件有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 
对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
vs
echo-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
vs
echo-e“3.14e-2\n3.15e-5”| sort-n
也说明了区别。如果我还有两列数据,我想做同样的事情,但基于第4列中的值。如果我还有两列数据,我想做同样的事情,但基于第4列中的值怎么办。