- 论坛徽章:
- 0
|
5可用积分
求一个文件内容比较脚本(按指定列进行比较)
awk、sed、perl、bash shell 都可以
本来想用hashmap来做,但是查了下好像shell没有相关信息
以下面fileA 、fileB 两个文件为例:
只比较列1、列2; 列3忽略不做比较
文件记录数不一样;
列分割符为"|";
A. 当fileA与fileB当前行的列2不相同时:
1. 把fileA中的当前行记录写入diffA
2. 把fileB中的当前行记录吸入diffB(如果当前行为空白则不写入)
B. 当fileA与fileB当前行的列2相同, 但列1不相同时:
1. 把fileA中的当前行记录写入diffA
2. 把fileB中的当前行记录吸入diffB
fileA (15行)内容:(# 后的内容为注释, 实际文件中不存在)- A|02942|20121126111458 # 相同记录(忽略第3列)
- A|03055|20121126110255 # 相同记录(忽略第3列)
- A|08931|20121126133649 # 写入diffB(fileB没有该记录)
- A|08932|20121126133743 # 写入diffA(与fileB的列1不相同)
- A|27822|20121126212704 # 相同记录(忽略第3列)
- A|31520|20121126153305 # 写入diffB(fileB没有该记录)
- A|31612|20121126103716 # 写入diffB(fileB没有该记录)
- D|40439|20121126193846 # 写入diffA(与fileB的列1不相同)
- D|43223|20121126113926 # 写入diffB(fileB没有该记录)
- A|45789|20121126142204 # 写入diffB(fileB没有该记录)
- A|46651|20121126143730 # 写入diffB(fileB没有该记录)
- A|49212|20121126152429 # 写入diffB(fileB没有该记录)
- A|52009|20121126173141 # 写入diffB(fileB没有该记录)
- A|60524|20121126171733 # 写入diffA(与fileB的列1不相同)
- A|61257|20121126113339 # 写入diffA(与fileB的列1不相同)
复制代码 fileB (12行)内容:(# 后的内容为注释, 实际文件中不存在)- A|02942|20071128200822 # 相同记录(忽略第3列)
- A|03055|20071128200827 # 相同记录(忽略第3列)
- D|08932|20071128201524 # 写入diffB(与fileA的列1不相同)
- D|13992|20091212125210 # 写入diffB(fileA没有该记录)
- D|21780|20071128202710 # 写入diffB(fileA没有该记录)
- A|27822|20071128203440 # 相同记录(忽略第3列)
- D|29558|20071128203708 # 写入diffB(fileA没有该记录)
- A|34079|20071128204308 # 写入diffB(fileA没有该记录)
- D|34619|20071128204330 # 写入diffB(fileA没有该记录)
- A|40439|20071128204933 # 写入diffB(与fileA的列1不相同)
- D|60524|20121126171733 # 写入diffB(与fileA的列1不相同)
- D|61257|20121126113339 # 写入diffB(与fileA的列1不相同)
复制代码 目标文件: diffA (# 后的内容为注释, 实际文件中不存在)- A|08931|20121126133649 # fileB没有该记录
- A|08932|20121126133743 # 与fileB的列1不相同
- A|31520|20121126153305 # fileB没有该记录
- A|31612|20121126103716 # fileB没有该记录
- D|40439|20121126193846 # 与fileB的列1不相同
- D|43223|20121126113926 # fileB没有该记录
- A|45789|20121126142204 # fileB没有该记录
- A|46651|20121126143730 # fileB没有该记录
- A|49212|20121126152429 # fileB没有该记录
- A|52009|20121126173141 # fileB没有该记录
- A|60524|20121126171733 # 与fileB的列1不相同
- A|61257|20121126113339 # 与fileB的列1不相同
复制代码 目标文件: diffB (# 后的内容为注释, 实际文件中不存在)- D|08932|20071128201524 # 与fileA的列1不相同
- D|13992|20091212125210 # fileA没有该记录
- D|21780|20071128202710 # fileA没有该记录
- D|29558|20071128203708 # fileA没有该记录
- A|34079|20071128204308 # fileA没有该记录
- D|34619|20071128204330 # fileA没有该记录
- A|40439|20071128204933 # 与fileA的列1不相同
- D|60524|20121126171733 # 与fileA的列1不相同
- D|61257|20121126113339 # 与fileA的列1不相同
复制代码 |
最佳答案
查看完整内容
#!/usr/bin/perlopen FILEA, "< $ARGV[0]";open FILEB, "< $ARGV[1]";while(){ chomp; push @fileA, $_;}while(){ chomp; push @fileB, $_;}(@fileA > @fileB) ? ($max=@fileA) : ($max=@fileB);for(0..$max-1){ $lineA=$fileA[$_]; $lineB=$fileB[$_]; $lineA=~s/^(\w+)\|(\w+)\|.*/$1$2/; $lineB=~s/^(\w+)\|(\w+)\|.*/$1$2/; if($lineA ne $lineB){ push @diffA, $fileA[$_]; push @diffB, $fileB[$_]; }}print "diffA:\n";fo ...
|