2011-10-25 67 views
3

我試圖加入兩個文件,其中每個文件都包含<key> <count>表格的行。每個文件都包含一些從另一個文件中缺失的行,我希望爲所有這些值插入零,而不是省略這些行(我見過--a,但這不是我正在尋找的內容)。有沒有簡單的方法來實現這一點?從unix命令行加入兩個文件最簡單的方法,爲缺少的鍵插入零條目

下面是一些示例輸入:

A.TXT

apple 5 
banana 7 

b.txt

apple 6 
cherry 4 

預期輸出:

apple 5 6 
banana 7 0 
cherry 0 4 
+0

零插入其中count是空的?你可以編輯你的問題,包括3行ea。從2個文件和預期的輸出。祝你好運 – shellter

+0

我懷疑殼是這個工作的正確工具。你不能在Python或Perl中使用腳本嗎? – phihag

回答

11
join -o 0,1.2,2.2 -e 0 -a1 -a2 a.txt b.txt 
  • -o 0,1.2,2.2→輸出連接字段,然後是第1個文件的第2個字段,然後是第2個文件的第2個字段。
  • -e 0→輸出0空的輸入字段。
  • -a1 -a2→顯示從文件1的所有值和文件2.
+0

本壘打!祝你們好運。 – shellter

0

寫一個腳本,任何你想要的語言。您將使用地圖/散列表/字典數據結構來解析這兩個文件(讓我們只說字典)。每個字典都將第一個字作爲關鍵字,並將計數(甚至是計數字符串)作爲值。下面是該算法的僞代碼:

Dict fileA, fileB; //Already parsed 
while(!fileA.isEmpty()) { 
     string check = fileA.top().key(); 
     int val1 = fileA.top().value(); 
     if(fileB.contains(check)) { 
      printToFile(check + " " + val1 + " " + fileB.getValue(check)); 
      fileB.remove(check); 
     } 
     else { 
      printToFile(check + " " + val1 + " 0"); 
     } 
     fileA.pop(); 
} 
while(!fileB.isEmpty()) {  //Know key does not exist in FileA 
    string check = fileB.top().key(); 
    int val1 = fileB.top().value(); 
    printToFile(check + " 0 " + val1); 
    fileB.pop(); 
} 

你可以使用任何類型的迭代器要經過數據結構,而不是流行音樂和頂部。顯然,您可能需要以不同的方式訪問數據,具體取決於您需要使用的語言/數據結構。

0

@ ninjalj的答案是非常理智的,但這裏只是一個有趣的shell腳本執行:

exec 8< a.txt 
exec 9< b.txt 

while true; do 
    if [ -z "$k1" ]; then 
    read k1 v1 <& 8 
    fi 
    if [ -z "$k2" ]; then 
    read k2 v2 <& 9 
    fi 
    if [ -z "$k1$k2" ]; then break; fi 
    if [ "$k1" == "$k2" ]; then 
    echo $k1 $v1 $v2 
    k1= 
    k2= 
    elif [ -n "$k1" -a "$k1" '<' "$k2" ]; then 
    echo $k1 $v1 0 
    k1= 
    else 
    echo $k2 0 $v2 
    k2= 
    fi 
done