我有数据输入文件格式如下例,
<name> <attr1> <attr2> <attr3> <working_area> <date>
alan x x x /path/to/alan_work/a Wed_May_17_04:17:40_2023
alan x x x /path/to/alan_work/b Sun_May_28_21:22:52_2023
alan x a x /path/to/alan_work/c Sun_May_28_22:25:47_2023
ben x x x /path/to/ben_work/a Wed_May_17_04:18:44_2023
ben a b x /path/to/ben_work/b Wed_May_17_08:19:47_2023
charles a a a /path/to/charles_work/a Wed_May_17_04:17:40_2023
charles a a a /path/to/charles_work/b Thurs_May_18_04:17:40_2023
ben x x x /path/to/ben_work/c Fri_May_19_04:18:44_2023
我写的Perl脚本,并希望达到以下标准:
1.对于同一个用户,如果在两个或两个以上不同的工作区中,属性1、2和3都相同,则获取具有最新日期属性的工作区路径
预期输出:
/path/to/alan_work/b
/path/to/alan_work/c
/path/to/ben_work/c
/path/to/ben_work/b
/path/to/charles_work/b
简短的片段(我不知道如何继续)
open(FF, '<', $temp_file) or die "cannot open $temp_file";
while (my $line = <FF>) {
chomp $line;
my @split_type = split(' ', $line);
#no idea here
}
3条答案
按热度按时间klr1opcd1#
将数据存储在以名称、属性和区域为键的散列中,使用日期作为值。按值对区域进行排序(您需要为您的格式实现日期比较,或者在填充散列时解析它并使用可比值填充散列)并返回最后一个。
%data
中收集的结构可以使用开关为示例提供以下输出:
您没有说明如果相同的名称、属性和区域有两个不同的日期会发生什么情况。当前实现仅使用输入中的最后一个对应行。
另外,您可以注意到我切换到词法文件句柄以避免单词文件句柄带来的问题。当使用
split ' '
时,您不需要chomp,因为这种特殊形式的分割会删除包括换行符在内的尾部空白。u1ehiz5o2#
o2g1uqev3#
由于值用空格分隔,日期组件用下划线分隔,因此处理这一点相当简单。
我们将使用用户名和属性作为散列的关键字,并将散列的值替换为最高日期值的工作路径。
要做到这一点,我们必须将日期转换为可以比较的标准形式:
***编辑:*删除了替代日期解析,因为在明确了日期格式后就不需要了。