亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6803 | 回復(fù): 12
打印 上一主題 下一主題

[文本處理] 求一個文件內(nèi)容比較腳本(按指定列進行比較) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-11-27 15:56 |只看該作者 |倒序瀏覽
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)容為注釋, 實際文件中不存在)
  1. A|02942|20121126111458  # 相同記錄(忽略第3列)
  2. A|03055|20121126110255  # 相同記錄(忽略第3列)
  3. A|08931|20121126133649  # 寫入diffB(fileB沒有該記錄)
  4. A|08932|20121126133743  # 寫入diffA(與fileB的列1不相同)
  5. A|27822|20121126212704  # 相同記錄(忽略第3列)
  6. A|31520|20121126153305  # 寫入diffB(fileB沒有該記錄)
  7. A|31612|20121126103716  # 寫入diffB(fileB沒有該記錄)
  8. D|40439|20121126193846  # 寫入diffA(與fileB的列1不相同)
  9. D|43223|20121126113926  # 寫入diffB(fileB沒有該記錄)
  10. A|45789|20121126142204  # 寫入diffB(fileB沒有該記錄)
  11. A|46651|20121126143730  # 寫入diffB(fileB沒有該記錄)
  12. A|49212|20121126152429  # 寫入diffB(fileB沒有該記錄)
  13. A|52009|20121126173141  # 寫入diffB(fileB沒有該記錄)
  14. A|60524|20121126171733  # 寫入diffA(與fileB的列1不相同)
  15. A|61257|20121126113339  # 寫入diffA(與fileB的列1不相同)
復(fù)制代碼
fileB (12行)內(nèi)容:(# 后的內(nèi)容為注釋, 實際文件中不存在)
  1. A|02942|20071128200822  # 相同記錄(忽略第3列)
  2. A|03055|20071128200827  # 相同記錄(忽略第3列)
  3. D|08932|20071128201524  # 寫入diffB(與fileA的列1不相同)
  4. D|13992|20091212125210  # 寫入diffB(fileA沒有該記錄)
  5. D|21780|20071128202710  # 寫入diffB(fileA沒有該記錄)
  6. A|27822|20071128203440  # 相同記錄(忽略第3列)
  7. D|29558|20071128203708  # 寫入diffB(fileA沒有該記錄)
  8. A|34079|20071128204308  # 寫入diffB(fileA沒有該記錄)
  9. D|34619|20071128204330  # 寫入diffB(fileA沒有該記錄)
  10. A|40439|20071128204933  # 寫入diffB(與fileA的列1不相同)
  11. D|60524|20121126171733  # 寫入diffB(與fileA的列1不相同)
  12. D|61257|20121126113339  # 寫入diffB(與fileA的列1不相同)
復(fù)制代碼
目標文件: diffA (# 后的內(nèi)容為注釋, 實際文件中不存在)
  1. A|08931|20121126133649  # fileB沒有該記錄
  2. A|08932|20121126133743  # 與fileB的列1不相同
  3. A|31520|20121126153305  # fileB沒有該記錄
  4. A|31612|20121126103716  # fileB沒有該記錄
  5. D|40439|20121126193846  # 與fileB的列1不相同
  6. D|43223|20121126113926  # fileB沒有該記錄
  7. A|45789|20121126142204  # fileB沒有該記錄
  8. A|46651|20121126143730  # fileB沒有該記錄
  9. A|49212|20121126152429  # fileB沒有該記錄
  10. A|52009|20121126173141  # fileB沒有該記錄
  11. A|60524|20121126171733  # 與fileB的列1不相同
  12. A|61257|20121126113339  # 與fileB的列1不相同
復(fù)制代碼
目標文件: diffB (# 后的內(nèi)容為注釋, 實際文件中不存在)
  1. D|08932|20071128201524  # 與fileA的列1不相同
  2. D|13992|20091212125210  # fileA沒有該記錄
  3. D|21780|20071128202710  # fileA沒有該記錄
  4. D|29558|20071128203708  # fileA沒有該記錄
  5. A|34079|20071128204308  # fileA沒有該記錄
  6. D|34619|20071128204330  # fileA沒有該記錄
  7. A|40439|20071128204933  # 與fileA的列1不相同
  8. D|60524|20121126171733  # 與fileA的列1不相同
  9. 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 ...

論壇徽章:
0
2 [報告]
發(fā)表于 2012-11-27 15:56 |只看該作者
#!/usr/bin/perl

open FILEA, "< $ARGV[0]";
open FILEB, "< $ARGV[1]";

while(<FILEA>){
        chomp;
        push @fileA, $_;
}

while(<FILEB>){
        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";
for(@diffA){
        print "$_\n";
}
print "diffB:\n";
for(@diffB){
        print "$_\n";
}

$ ./diff.pl fileA.txt fileB.txt
diffA:
A|08931|20121126133649
A|08932|20121126133743
A|27822|20121126212704
A|31520|20121126153305
A|31612|20121126103716
D|40439|20121126193846
D|43223|20121126113926
A|45789|20121126142204
A|46651|20121126143730
A|49212|20121126152429
A|52009|20121126173141
A|60524|20121126171733
A|61257|20121126113339
diffB:
D|08932|20071128201524
D|13992|20091212125210
D|21780|20071128202710
A|27822|20071128203440
D|29558|20071128203708
A|34079|20071128204308
D|34619|20071128204330
A|40439|20071128204933
D|60524|20121126171733
D|61257|20121126113339

論壇徽章:
0
3 [報告]
發(fā)表于 2012-11-27 15:59 |只看該作者
helpid 發(fā)表于 2012-11-27 15:56
求一個文件內(nèi)容比較腳本(按指定列進行比較)
awk、sed、perl、bash shell 都可以


源文件.zip (469 Bytes, 下載次數(shù): 14)

論壇徽章:
32
處女座
日期:2013-11-20 23:41:20雙子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00處女座
日期:2014-07-22 17:30:47獅子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥豬
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58處女座
日期:2014-12-02 09:17:52程序設(shè)計版塊每日發(fā)帖之星
日期:2015-06-16 22:20:002015亞冠之塔什干火車頭
日期:2015-06-20 23:28:22
4 [報告]
發(fā)表于 2012-11-27 16:10 |只看該作者
第3行,列2不同,應(yīng)該屬于A這種情況吧?但是你兩個都寫入diffB是什么意思?

論壇徽章:
0
5 [報告]
發(fā)表于 2012-11-27 16:14 |只看該作者
以下是我的一個思路,還沒法完全用awk寫出來。很多地方需要幫助指正。
  1. # A文件
  2. fileA=fileA
  3. # B文件
  4. fileB=fileB

  5. # A的行數(shù)索引
  6. A_index=1
  7. # A的總記錄數(shù)
  8. A_row_count=$(sed -n '$=' ${fileA})

  9. # B的行數(shù)索引
  10. B_index=1
  11. # B的總記錄數(shù)
  12. B_row_count=$(sed -n '$=' ${fileB})

  13. awk -F'|'
  14.         -vA_index=${A_index}
  15.         -vA_row_count=${A_row_count}
  16.         -vB_index=${B_index}
  17.         -vB_row_count=${B_row_count}
  18.        
  19.         '
  20.         BEGIN
  21.         {
  22.                 i=1
  23.         }
  24.         while(i<NR)
  25.         {
  26.                 if(A_index>=A_row_count)
  27.                 {
  28.                         # 從fileB當前索引行到fileB最后一行的所有數(shù)據(jù)寫入diffB
  29.                         for(j=B_index;j<=B_row_count;j++)
  30.                         {
  31.                                 print "B",B_index # 暫時沒寫出來
  32.                         }
  33.                         break;
  34.                 }
  35.                 else if(B_index>=B_row_count)
  36.                 {
  37.                         # 從fileA當前索引行到fileA最后一行的所有數(shù)據(jù)寫入diffA
  38.                         for(j=A_index;j<=A_row_count;j++)
  39.                         {
  40.                                 print "A",A_index # 暫時沒寫出來
  41.                         }
  42.                         break;
  43.                 }
  44.                 else
  45.                 {
  46.                         a[NR]=$0 # 讀取fileA的行數(shù)據(jù)(貌似不對)
  47.                         # 判斷當前行是否為空
  48.                         if(length(a[NR])==0)
  49.                         {
  50.                                 A_index++
  51.                                 continue
  52.                         }
  53.                        
  54.                         b[NR]=$0 # 讀取fileB的行數(shù)據(jù)(貌似不對)
  55.                         # 判斷當前行是否為空
  56.                         if(length(b[NR])=0)
  57.                         {
  58.                                 B_index++
  59.                                 continue
  60.                         }
  61.                        
  62.                         A_type[NR]=$1;A_msisdn[NR]=$2 # 解析fileA的當前行第1列和第2列數(shù)據(jù)
  63.                         B_type[NR]=$1;B_msisdn[NR]=$2 # 解析fileB的當前行第1列和第2列數(shù)據(jù)
  64.                        
  65.                         # fileA的第2列 == fileB的第2列
  66.                         if(A_msisdn[NR]==B_msisdn[NR])
  67.                         {
  68.                                 # fileA的第1列 != fileB的第1列
  69.                                 if(A_type[NR]!=B_type[NR])
  70.                                 {
  71.                                         print A"$0" # fileA的當前行數(shù)據(jù)寫入diffA(貌似不對)
  72.                                         print B"$0" # fileB的當前行數(shù)據(jù)寫入diffB(貌似不對)
  73.                                 }
  74.                                 A_index++
  75.                                 B_index++
  76.                         }
  77.                         # fileA的第2列 > fileB的第2列
  78.                         else if(A_msisdn[NR]>B_msisdn[NR])
  79.                         {
  80.                                 print B"$0" # fileB的當前行數(shù)據(jù)寫入diffB(貌似不對)
  81.                                 B_index++
  82.                         }
  83.                         # fileA的第2列 < fileB的第2列
  84.                         else
  85.                         {
  86.                                 print A"$0" # fileA的當前行數(shù)據(jù)寫入diffA(貌似不對)
  87.                                 A_index++
  88.                         }
  89.                 }
  90.                 i++;
  91.         }
  92.         ' fileA fileB
復(fù)制代碼

論壇徽章:
0
6 [報告]
發(fā)表于 2012-11-27 16:41 |只看該作者
  1. awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&!($1$2 in a){print $0}' fileA fileB > diffA
  2. awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&!($1$2 in a){print $0}' fileB fileA > diffB
復(fù)制代碼
搞定了。awk 太強悍了。。。。

論壇徽章:
0
7 [報告]
發(fā)表于 2012-11-27 16:42 |只看該作者
awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&!($1$2 in a){print $0}' fileA fileB > diffA
awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&!($1$2 in a){print $0}' fileB fileA > diffB

論壇徽章:
0
8 [報告]
發(fā)表于 2012-11-27 17:25 |只看該作者
  1. # 只在file1中有的行
  2. awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&!($1$2 in a){print $0}' file2 file1
  3. # 只在file2中有的行
  4. awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&!($1$2 in a){print $0}' file1 file2
  5. # 同時在file1和file2中的行
  6. awk -F'|' 'ARGIND==1{a[$1$2]}ARGIND>1&&($1$2 in a){print $0}' file1 file2
復(fù)制代碼
以上方法參照了jomenxiao的文章:
http://blog.chinaunix.net/uid-25149914-id-3091426.html

論壇徽章:
0
9 [報告]
發(fā)表于 2012-11-27 21:10 |只看該作者
回復(fù) 6# helpid


    DS,可以解釋一下ARGIND==1 和ARGIND>1 究竟是什么意思??

論壇徽章:
0
10 [報告]
發(fā)表于 2012-11-27 21:59 |只看該作者
A|27822|20121126212704  # 相同記錄(忽略第3列)

This line is not the same between A and B, A is in line #5, B is in line #6
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP