2014-01-28 21 views
1

文件1行明智的殼或AWK兩個文件映射

5063005905|06776|0|1 

5063005905|06776|1|16 

5063005905|06776|2|59729 

4999999999|Z9991|2|119 

文件2

5063005905|Z9992|0|59730 

5063005905|Z9992|1|16 

4999999999|Z9991|2|121 


4999999999|Z9991|2|122 

遍歷文件1對1列和基於列的1千萬查找的文件2,在一個行合併線。這裏5063005905在file1中是3次,但在文件2中只有2次,所以一個將是null,另外兩個應該映射。

同樣4999999999是一次file1中但在兩次文件2.

輸出所需

5063005905|06776|0|1 : null 

5063005905|06776|1|16 : 5063005905|Z9992|1|16 

5063005905|06776|2|59729 : 5063005905|Z9992|0|59730 

4999999999|Z9991|2|119 : 4999999999|Z9991|2|121 

Null: 4999999999|Z9991|2|122 

我用以下

while read x 
do 

    ppt=`echo $x |cut -d'|' -f1` 
    grep -w $ppt file2|while read -r line ;do 
    echo "$x:$line" 
done<file1 
+0

這兩個數字在兩個文件中的排列順序是否始終相同?它們總是聚集在一起還是隨機排列? – Noctua

+0

訂單將是隨機的。我們需要查看。 – Ash

+1

File1有3個5063005905的實例,而File2只有2個實例。實例應該如何映射,或者無關緊要? –

回答

3

這接近期望的輸出。把下列句子變成像awko文件,然後chmod +x awko

#!/usr/bin/awk -f 

BEGIN { FS="|" } 

# concatenate matching rows in the first file 
/^[0-9]/ && NR==FNR { a[$1] = ($1 in a ? a[$1] ":" : "") $0; next } 
# concatenate rows in reverse order in the 2nd file 
/^[0-9]/ { b[$1] = $0 ($1 in b ? ":" b[$1] : "") } 

END { 
    # walk a array 
    for(i in a) { 
     # split out the concatenated data 
     a2_cnt = split(a[i], a2, ":") 
     b2_cnt = 0 
     if(i in b) b2_cnt = split(b[i], b2, ":") 

     # get a max() value for k 
     k = (b2_cnt > a2_cnt) ? b2_cnt : a2_cnt 

     # a2 goes up, b2 goes down to make the output 
     for(j = 1; j < a1_cnt || k > 0; j++) { 
      a2_val = j in a2 ? a2[j] : "null" 
      b2_val = k in b2 ? b2[k] : "null" 
      print a2_val " : " b2_val 
      k-- 
     } 
    } 
} 

運行awko file1 file2給我下面的輸出:

4999999999|Z9991|2|119 : 4999999999|Z9991|2|121 
null : 4999999999|Z9991|2|122 
5063005905|06776|0|1 : null 
5063005905|06776|1|16 : 5063005905|Z9992|0|59730 
5063005905|06776|2|59729 : 5063005905|Z9992|1|16 

看來,要通過第4列排序的數據它重新組裝前。在這種情況下,您可以sort -k4,4 -t"|" file1 > file1.sorted(類似於file2)。

運行awko file1.sorted file2.sorted排隊的數據在你的榜樣,雖然輸出不同的排序:

4999999999|Z9991|2|119 : 4999999999|Z9991|2|121 
null : 4999999999|Z9991|2|122 
5063005905|06776|0|1 : null 
5063005905|06776|1|16 : 5063005905|Z9992|1|16 
5063005905|06776|2|59729 : 5063005905|Z9992|0|59730 

腳本也許可以簡化。這是我第一次參加。爲了避免排序調用,可以從a2b2構建具有$4索引的新陣列,然後對其進行排序並使用asorti()調用進行排序。我現在沒有時間去玩。