我有一个文本文件,其中包含以下格式的制表符分隔列:
fileName Type sc1 sc2 sc3 sc4 sc5 sc6
file1 abc 0 0.2 0 0 0 0
file1 xyz 0 0.8 0 0 0.8 0.2
file2 abc 0.5 0 0 0.1 0 0
file2 xyz 0 0 0 0.7 0.003 0.1
file3 abc 0.002 0 0 0 0.04 0
file3 xyz 0.5 0 0 0 0 0.3
.
.
第一行是标题行。 sc1、sc2、sc3 等分别是分数 1、分数 2、分数 3(它们不全为零)
有两种以上类型,并且每个文件具有相同数量的类型。
如何知道 xyz 类型的 sc6 最低的文件名? 或者如何从此文件创建另一个文本文件,该文件将为所有 xyz 类型提供文件名和 sc6?
我真的不想将其作为数据库加载或执行类似的操作。我想知道是否可以使用 Unix 的 cut
、 sort
或 grep
命令快速完成此任务。任何 perl、awk 解决方案也可以接受。
如果问题不太清楚,请告诉我。
附注请随意为这个问题建议不同的标题。这是我能想到的最好的办法了。
最佳答案
你可以这样写一句:
perl -lanwe 'next unless $F[1] eq "xyz";
$a{$F[0]}{$F[1]} = $F[7];
}{
for my $file (sort { $a{$b}{xyz} <=> $a{$a}{xyz} } keys %a) {
print qq($file : $a{$file}{xyz}); }'
Autosplit -a
将按空格拆分为数组 @F
,同时从标准输入或参数文件名读取(-n
开关)。输入结束后(}{
“operator”),存储的结果将被排序并打印。将跳过除“xyz”之外的所有类型。
输入和输出:
file1 abc 0 0 0 0 0 0
file1 xyz 0 0 0 0 0 0
file2 abc 0 0 0 0 0 0
file2 xyz 0 0 0 0 0 0
file3 abc 0 0 0 0 0 0
file4 xyz 0 0 0 0 0 1
file4 : 1
file2 : 0
file1 : 0
注意:我必须在输入中添加一行才能看到它实际排序。对于需要排序的东西来说,这是多么可怕的样本数据!
关于perl - 如何根据一组行的列的最低值对文本文件的内容进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715562/