2015-06-10 43 views
-1

我正在處理我最初的bash腳本,並被困在需要來自論壇的幫助的地方。Diff 2長字符串並在第三個文件中寫入結果

如何在shell腳本中實現以下內容? (任何建議/指針理解!!!)

要求:

比較2個文件匹配數KEY包含長串和在第三文件堅持只長串這在其他屬性不同(說USER的值是不同的) 。也跳過一些屬性比較。

輸入FILE1-

AAUTOX=Y;ACCT=;ACTION=C;APRICE=99.975;AQTY=5541;USER=Sam,bpl;CONFIRM=Y;KEY=29976DYE4;DEPT=MYNA-CLCD -- same 
AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Todd,chr) write in result file 

輸入FILE2-

AAUTOX=Y;ACCT=;ACTION=C;APRICE=99.975;AQTY=5541;USER=Sam,bpl;CONFIRM=Y;KEY=29976DYE4;DEPT=MYNA-CLCD -- same 
AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Alan,ncr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Alan,ncr) write in result file 
AAUTOX=Y;ACCT=;ACTION=C;APRICE=17.000;AQTY=6453;USER=Todd,chr;CONFIRM=N;KEY=29976DYE6;DEPT=MYNA-CLCD -- no match (KEY) found write in result file 

輸出FILE3:

FILE1:AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD 
FILE2:AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Alan,ncr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD 


FILE1: 

FILE2: AAUTOX=Y;ACCT=;ACTION=C;APRICE=17.000;AQTY=6453;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD 

等爲每個遞延線....

方法在我心中(這是第一次切後CUD提高):通過線(AWK或讀?) 每行

  • 一)

    • 讀FILE1讀取線FILE2匹配獨特的「鑰匙」(該命令在這裏使用? ?? awk可以根據鍵讀取文件嗎? (FILE2中的grep KEY,但是如何將行分割成字段進行比較?)
    • b)現在將FILE1.LINE1的每個字段與FILE2.LINE進行比較,如果第三個結果文件中的不同寫入(awk將行分爲$ 1,$ 2這樣就可以比較 但不知道怎麼做,如果使用「讀」命令???)
+1

預期的樣本輸出可以幫助我們更好地理解 –

+0

添加樣本輸出。謝謝 – nads

+0

結果文件行的順序是否重要(它們可以以不同於它們在輸入文件中出現的順序出現)?是指定哪一行輸入文件(即插入的'FILE#:'行前綴)是重要的?是否表示文件中沒有匹配(例如,在您的示例中只有'FILE1:'的行)重要? –

回答

1

它使用GNU AWK 4 *爲分類in(見http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal),以及其他可以通過管道awks排序或以其他方式確定關鍵訂單:

$ cat tst.awk 
BEGIN { FS="[;=]" } 
{ 
    delete name2val 
    for (i=1; i<=NF; i+=2) { name2val[$i] = $(i+1) } 
    key = name2val["KEY"] 
    keys[key] 
    recs[key,FILENAME] = $0 
    for (name in name2val) { vals[key,FILENAME,name] = name2val[name] } 
} 
END { 
    PROCINFO["sorted_in"] = "@ind_str_asc" 
    file1 = ARGV[1] 
    file2 = ARGV[2] 
    for (key in keys) { 
     state = "SAME" 
     if ((key,file1) in recs) { 
      if ((key,file2) in recs) { 
       for (name in name2val) { 
        if (name != "CONFIRM") { 
         if (vals[key,file1,name] != vals[key,file2,name]) { 
          state = "DIFF" 
         } 
        } 
       } 
      } else { state = "FILE1_ONLY" } 
     } else { state = "FILE2_ONLY" } 

     if (state != "SAME") { 
      print file1":", recs[key,file1] 
      print file2":", recs[key,file2] 
      print "" 
     } 
    } 
} 

$ gawk -f tst.awk FILE1 FILE2 
FILE1: AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Todd,c 
hr) write in result file 
FILE2: AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Alan,ncr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Alan,ncr) write in result file 

FILE1: 
FILE2: AAUTOX=Y;ACCT=;ACTION=C;APRICE=17.000;AQTY=6453;USER=Todd,chr;CONFIRM=N;KEY=29976DYE6;DEPT=MYNA-CLCD -- no match (KEY) found write in result file 
+0

謝謝@Ed發佈答案。你能解釋一下嗎?什麼聲明在做什麼?這是一個很長的awk腳本。 – nads

+0

對不起,但大多數這是基本的東西(填充數組,然後循環數組內容)和恕我直言很容易遵循,所以idk從哪裏開始。有什麼特別的部分,你有麻煩跟進? –

相關問題