Python 是否根据列的数字内容从选项卡分隔的文件中删除列?
我有一个选项卡分隔的文件,请参见以下内容: 第一列包含位置编号1-end 其余的有一些频率数字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
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
使用严格;
使用“全部”警告;
使用特征“说”;
使用自动模具;
使用列表::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