- 論壇徽章:
- 0
|
5可用積分
求一個文件內(nèi)容比較腳本(按指定列進行比較)
awk、sed、perl、bash shell 都可以
本來想用hashmap來做,但是查了下好像shell沒有相關(guān)信息
以下面fileA 、fileB 兩個文件為例:
只比較列1、列2; 列3忽略不做比較
文件記錄數(shù)不一樣;
列分割符為"|";
A. 當fileA與fileB當前行的列2不相同時:
1. 把fileA中的當前行記錄寫入diffA
2. 把fileB中的當前行記錄吸入diffB(如果當前行為空白則不寫入)
B. 當fileA與fileB當前行的列2相同, 但列1不相同時:
1. 把fileA中的當前行記錄寫入diffA
2. 把fileB中的當前行記錄吸入diffB
fileA (15行)內(nèi)容:(# 后的內(nèi)容為注釋, 實際文件中不存在)- 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不相同)
復(fù)制代碼 fileB (12行)內(nèi)容:(# 后的內(nèi)容為注釋, 實際文件中不存在)- 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不相同)
復(fù)制代碼 目標文件: diffA (# 后的內(nèi)容為注釋, 實際文件中不存在)- 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不相同
復(fù)制代碼 目標文件: diffB (# 后的內(nèi)容為注釋, 實際文件中不存在)- 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不相同
復(fù)制代碼 |
最佳答案
查看完整內(nèi)容
#!/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 ...
|