【发布时间】:2014-03-11 01:05:36
【问题描述】:
我有一个包含多行多列的大文件。每行有许多列,并且许多行在同一位置具有相同的名称。例如
A C Z Y X
A C E J
B E K L M
查找在某个位置共享相同项目的所有行的最佳方法是什么?比如我想知道有2个A、2个C、1个D等等,都是按列排序的。
我真的是 Perl 的新手,所以我在这方面付出了很多努力,因此感谢任何提示。
我到了这一点:
#!/usr/local/bin/perl -w
use strict;
my $path='My:\Path\To\My\File.txt';
my $columns;
my $line;
open (FILE,$path), print "Opened!\n" or die ("Error opening");
while (<FILE>)
{
@line=split('\t',$_);
}
close FILE;
它的输出可以是另一个 TSV,它只检查文件直到第 5 列,从上到下排序,如:
A 2
C 2
Z 1
Y 1
E 1
J 1
B 1
E 1
K 1
L 1
请注意,第一个项目首先出现,并且在各行之间共享时,不会在后续行中再次显示。
编辑:根据 cmets 中的问题,我更改了数据集和输出。注意出现了两个E:一个属于第三列,另一个属于第二列。
Edit2:或者,也可以逐列分析,从而在第一列中显示结果,然后在第二列中显示结果,依此类推,只要它们被清楚地分开即可。类似的东西
"1st" "col"
A 2
B 1
"2nd" "col"
C 2
E 1
"3rd" "col"
Z 1
E 1
K 1
"4th" "col"
Y 1
J 1
L 1
【问题讨论】:
-
请显示您希望看到的输出。
-
@Borodin 完成,我希望现在很清楚
-
那么如果一个符号出现,它总是在同一个位置? (那为什么位置在要求中完全相关?只是说你想计算符号?)
-
@tripleee,可能会发生某些行共享相同的名称,但由于它们位于不同的列中而无法分组。例如
A B E和X E Z。在这种情况下,我想将E都算作不同的位置 -
好吧,我认为职位之间的区别很难实现