Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否根据列的数字内容从选项卡分隔的文件中删除列?_Python_Bash_Perl_Csv - Fatal编程技术网

Python 是否根据列的数字内容从选项卡分隔的文件中删除列?

Python 是否根据列的数字内容从选项卡分隔的文件中删除列?,python,bash,perl,csv,Python,Bash,Perl,Csv,我有一个选项卡分隔的文件,请参见以下内容: 第一列包含位置编号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

我有一个选项卡分隔的文件,请参见以下内容: 第一列包含位置编号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列,第二列包含每个位置的最高频率

理想输出:

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
awk'{max=$1;对于(i=2;imax){max=$i;};printf“%f\n”,max}file.tsv

我正试图为这个问题编写一个bash解决方案,但Perl/Python是最受欢迎的

由于您选择了Python标记,因此可以在Python中执行以下操作:

import sys
import csv

with open(sys.argv[1], 'rb') as f_input:
    tsv = csv.reader(f_input, delimiter='\t')
    next(tsv)
    data = []

    for row in tsv:
        row = map(int, row)
        data.append([row[0]] + [max(row[1:])])

with open(sys.argv[1], 'wb') as f_output:
    tsv = csv.writer(f_output, delimiter='\t')
    tsv.writerow(['Position', 'HighFreq'])
    tsv.writerows(data)
解释

  • -MList::Util=max

    加载
    List::Util::max

  • -F/\t/-a

    激活自动拆分并将分隔符设置为
    /\t/

  • -lne

    自动附加适当的行尾,应用一行,逐行处理
    ARGV
    输入

  • 打印加入“\t”…

    打印选项卡分隔

  • $。==1 ? ... : ...

    处理列标题

  • max(@F[1..$#F])

    返回
    @F

在Perl中

使用严格;
使用“全部”警告;
使用特征“说”;
使用自动模具;
使用列表::Util'max';

打开我的$fh,'把自己局限于一行的丑陋似乎是愚蠢的。除非您确定不再需要此功能,否则您将不得不在一个非常无情的环境中一次又一次地经历编码过程。
$ perl -MList::Util=max -F/\t/ -lane 'print join "\t", $. == 1 ? qw(Position HighFreq) : ( $F [0], max(@F[1..$#F]) )'
awk 'BEGIN{print"Position\tHighFreq"}{if(NR==1)next; max=0;for(i=2;i<=NF; i++) {if($i>max){max=$i;}} printf"%d\t%d\n",$1,max;}' file.tsv
Position    HighFreq
1   117
2   16
3   11
4   5
5   15
6   108
7   147