perl - 如何根据一组行的列的最低值对文本文件的内容进行排序

标签 perl bash unix text text-files

我有一个文本文件,其中包含以下格式的制表符分隔列:

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 的 cutsortgrep 命令快速完成此任务。任何 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/

相关文章:

perl - 在 perl : Label not found 中的嵌套 while 循环中跳出最内层循环

regex - 全局 g 正则表达式标志的奇怪行为

regex - 将键和值从 Perl 正则表达式传递到哈希

perl - 如何使用插件编写 Perl 对象?

Linux/OpenSSL :Send find output to openssl

linux - 用 ASCII 空格替换字符串中的 HEX 字符 (\x20)

unix - 如何使用 sed 将 & 替换为 &

linux - 如何删除标签?

c - 为什么 %u %d 在 UNIX/LINUX 上不能用于打印地址

unix - 仅使用某些列进行排序