我有一个制表符分隔的文件,如下所示: 第一列包含位置编号,1-end 其余的都有一些频率数字。
Position A B C D
1 117 0 1 0
2 4 0 0 16
3 0 5 11 0
4 0 0 0 5
5 0 15 0 0
6 100 0 108 0
7 0 0 147 0
我想重新格式化此文件以使其具有两列,第一列是保持原样的位置列,第二个包含每个位置的最高频率。
理想输出:
Position HighFreq
1 117
2 16
3 11
4 5
5 15
6 108
7 147
到目前为止,我拥有的是一个选择最大数字并打印的函数:
awk '{max=$1; for(i=2;i<=NF; i++) {if($i>max){max=$i;}};printf"%f\n",max}' file.tsv
我正在尝试为这个问题编写一个 bash 解决方案,但最受欢迎的是 Perl/Python!
最佳答案
$ perl -MList::Util=max -F/\t/ -lane 'print join "\t", $. == 1 ? qw(Position HighFreq) : ( $F [0], max(@F[1..$#F]) )'
说明
-MList::Util=max
加载
List::Util::max
-F/\t/-a
激活自动分割并将分隔符设置为
/\t/
-lne
自动附加适当的行结尾,应用单行,逐行处理
ARGV
输入打印连接“\t”,...
打印制表符分隔
$. == 1 ? ...:...
处理列标题
max(@F[1..$#F])
返回
@F
中除第一个元素之外的所有元素的最大值
关于python - 根据列的数字内容从制表符分隔的文件中删除列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49232844/