Linux 合并具有相似列条目的两个文件
我有几个文件,其中包含用户名和数据传输速率(MB/s)。这些数据收集了一年,每个月的报告保存在12个不同的文件中。我必须合并所有文件以准备最终报告 文件如下Linux 合并具有相似列条目的两个文件,linux,perl,shell,unix,Linux,Perl,Shell,Unix,我有几个文件,其中包含用户名和数据传输速率(MB/s)。这些数据收集了一年,每个月的报告保存在12个不同的文件中。我必须合并所有文件以准备最终报告 文件如下 Filename1 : January #User Name #Data Transferred A. Paul 300004 Jason 600000 Mayur Pandey 40000 Kelly
Filename1 : January
#User Name #Data Transferred
A. Paul 300004
Jason 600000
Mayur Pandey 40000
Kelly H 459000
Ryan M 349000
Filename2 : March
#User Name #Data Transferred
Senthl V R 600000
Mayur Pandey 40000
Kelly H 459000
Pratap S 349000
A. Paul 300004
同样,我还有10个文件。我必须将所有这些文件合并到一个文件中,最终输出如下:
Final Report:
#Username #January .... #March ......... #December #Total
A. Paul 300004 300004 Not available 600008
Pratap S Not availanble 30000 32000 7899887
Kelly H 459000 459000 459000 3424448274
Mayur Pandey 40000 400000 400000 242424442
Senthl V R Not available 600000 34544 53546464
Jason 600000 Not available 3434343 43434355
我需要一个Perl脚本来实现自动化,而不是使用Excel或手动完成
这些报告每月生成一次,名称不按排序顺序存储。名称存储在最近使用过数据传输设施的用户中。此外,有时用户在某个月内根本没有使用数据传输;在这种情况下,用户名称将不会出现在月度报告文件中。在这种情况下,我必须在“月份名称”列中添加“不可用”
所有字段或列值由\t选项卡分隔,并存储在普通txt文件中
谢谢你这比真正的困难要复杂得多。文件名将成为输出中的列标题。您可能会将命令行上文件名的顺序视为它们作为输出列显示的顺序;否则,你会积累太多的知识。在读取每个文件时,您将把行拆分为名称和编号。您需要一个按名称索引的散列,这些值要么是对散列的引用,要么是对数组的引用 产出相对直接。您决定显示名称的顺序(您的示例输出没有可辨别的顺序),然后按该顺序逐步执行哈希。对于每个条目,您可以打印每列中的值,在缺少条目时进行识别,并在缺少值时打印“不可用”或其他内容。您可以边走边累积行的总数,同样也可以累积总总数
您可能希望对数字进行右对齐,而不是左对齐。虽然下面的代码在某些方面不是很聪明,但我认为它可以解决您的问题
use warnings;
my @file_list=("January","February","March","April","May","June","July","August","September","October","November","December");
my %priorities=(
January=>1,
February=>2,
March=>3,
April=>4,
May=>5,
June=>6,
July=>7,
August=>8,
September=>9,
October=>10,
November=>11,
December=>12
);
my %report_datas=();
foreach my $file_name (@file_list) {
open FH , "<" , $file_name or die("can not open file");
$skip_line=0;
while(<FH>) {
$skip_line++;
next until $skip_line>2; #skip the header(first two lines)
chomp;
if(/[^\d]+/) { #get the name
$name=$&;
$name=~s/\s+$//; #strip the empty chars at the end
}
if(/[\d]+/) { #get the transfer data
$data=$&;
}
$month=$file_name;
$report_datas{$name}{$month}=$data if not exists $report_datas{$name}{$month};
$report_datas{$name}{"priority"}=$priorities{$month}; #always store the latest month while we are reading file_name from January to December
}
close FH;
}
#sort names by the month of using transfer data
@sorted_names = sort { $report_datas{$a}{"priority"} <=> $report_datas{$b}{"priority"} } keys %report_datas;
#print result
printf "%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s\n\n","#Username","#January","#February","#March","#April","#May","#June","#July","#August","#September","#October","#November","#December","#Total";
foreach my $name (@sorted_names) {
my $sum=0;
printf "%-18s",$name;
foreach my $month (@file_list) {
if ( exists $report_datas{$name}{$month}) {
printf "%-18d",$report_datas{$name}{$month};
$sum+=$report_datas{$name}{$month};
} else {
printf "%-18s","Not available";
}
}
print "$sum\n";
}
使用警告;
我的@file_列表=(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”);
我的%优先级=(
一月=>1,
二月=>2日,
三月=>3日,
四月=>4日,
五月=>5日,
六月=>6日,
七月=>7日,
八月=>8日,
九月=>9日,
10月=>10日,
11月=>11日,
12月=>12日
);
我的%report_数据=();
foreach我的$file\u名称(@file\u列表){
打开FH,“我无法对此要求做出任何逻辑。