2015-05-25 50 views
2

假設我有一個非常文件,我從兩個文件創建一個是舊的&另一個是通過在主鍵上使用cat &排序更新的文件。awk來處理前兩行然後接下來的兩個等

文件1

102310863||7097881||6845193||271640||06007709532577|||| 
102310863||7097881||6845123||271640||06007709532577|||| 
102310875||7092992||6840808||023740||10034500635650|||| 
102310875||7092992||6840818||023740||10034500635650|||| 

所以這個文件的模式是line 1 = old value & line 2 = updated value &等..

現在我要處理的文件中了awk第一個進程的前兩行這樣的方式文件&找出差異&然後移動兩下兩行。

現在這個過程是

if($[old record]!=$[new record]) 
    i= [new record]#[old record]; 

所需的輸出

102310863||7097881||6845123#6845193||271640||06007709532577|||| 
102310875||7092992||6840818#6840808||023740||10034500635650|||| 

回答

2
$ cat tst.awk 
BEGIN { FS="[|][|]"; OFS="||" } 
NR%2 { split($0,old); next } 
{ 
    for (i=1;i<=NF;i++) { 
     if (old[i] != $i) { 
      $i = $i "#" old[i] 
     } 
    } 
    print 
} 
$ 
$ awk -f tst.awk file 
102310863||7097881||6845123#6845193||271640||06007709532577|||| 
102310875||7092992||6840818#6840808||023740||10034500635650|||| 
0

更新版本,感謝@馬丁爲雙|招:

$ cat join.awk 
BEGIN {new=0; FS="[|]{2}"; OFS="||"} 
new==0 { 
     split($0, old_data, "[|]{2}") 
     new=1 
     next 
     } 
new==1 { 
     split($0, new_data, "[|]{2}") 
     for (i = 1; i <= 7; i++) { 
      if (new_data[i] != old_data[i]) new_data[i] = new_data[i] "#" old_data[i] 
     } 
     print new_data[1], new_data[2], new_data[3], new_data[4], new_data[5], new_data[6], new_data[7] 
     new = 0 
     } 
$ awk -f join.awk data.txt 
102310863||7097881||6845123#6845193||271640||06007709532577|||| 
102310875||7092992||6840818#6840808||023740||10034500635650|||| 
+0

使用'awk -F'[|] {2}'',在我發現awk和'|'部分後,我只是想着要做類似於你的事情。或者,'awk -F'\\ | \\ |''也可以。 – martin

+0

而不是硬編碼的字段數量,你可以使用'split'或簡單的'NF'的返回值... – anishsane

1

awk可以幫助:

$ awk -F '\\|\\|' '{ 
     getline new; 
     split(new, new_array, "\\|\\|"); 
     for(i=1;i<=NF;i++) { 
      if($i != new_array[i]) { 
       $i = new_array[i]"#"$i; 
      } 
      } 
     } 1' OFS="||" < input_file 

102310863||7097881||6845123#6845193||271640||06007709532577|||| 
102310875||7092992||6840818#6840808||023740||10034500635650|||| 

我想,你已經足夠了解awk瞭解上面的代碼。跳過解釋。

+0

類似的想法,我自己的,但更簡潔的執行。 Upvoted。 – chw21

相關問題