2017-06-01 76 views
-2

data.txt中(數據;密鑰;數據;鍵):使用awk,將一個文件中的多個關鍵數據與第二個文件中的多個關鍵值結合起來?

Data1;Key1;DataA;KeyA 
Data2;Key2;DataB;KeyB 
Data3;Key3;DataC;KeyA 
Data4;Key2;DataC;KeyB 
Data3;Key1;DataB;KeyA 
Data2;Key5;DataA;KeyB 

keys.txt(密鑰;值;密鑰;值;密鑰;值):

Key1;10;keyA;100;keyB;1000; 
Key2;20;keyA;200;keyB;2000; 
Key3;30;keyA;300;keyB;3000; 
Key4;30;keyA;400;keyB;4000; 

因此,KEYA上與Key1相同的行給出KeyA=100。 類似地,與Key2相同的行上的KeyA給出KeyA=200。 KeyB的相似過程。

輸出(從keys.txt適當的兩個值追加到data.txt中的每一行):

Data1;Key1;DataA;KeyA;10;100 
Data2;Key2;DataB;KeyB;20;2000 
Data3;Key3;DataC;KeyA;30;300 
Data4;Key2;DataC;KeyB;20;2000 
Data3;Key1;DataB;KeyA;10;100 
Data2;Key5;DataA;KeyB;-;- 

例如,在data.txt中第一行包含密鑰1和KEYA,因此發現該行的輸出的第一行中,其中包含密鑰1和 附加與其對應的值,則無論是附加KEYA或KEYB,在這種情況下KEYA其是100於是從KEYB在keys.txt第一行keys.txt不 用於任何。

在最後一排data.txt包含鍵5,但在keys.txt沒有鍵5,因此追加一個默認值; - ; -

+2

**哎呀,你忘了發佈您的代碼!** StackOverflow的是幫助人們解決他們的代碼。這不是免費的編碼服務。任何代碼都比沒有代碼更好。即使你不知道如何編寫它,甚至元代碼也會演示你如何看待程序應該起作用。請查看http://stackoverflow.com/help/how-to-ask獲取有關改善此問題的提示。 – ghoti

回答

1

保存這一個文件名爲program

BEGIN { FS=";"; } 
NR==FNR { 
    data[$1] = $2; 
    data[$1, toupper($3)] = $4; 
    data[$1, toupper($5)] = $6; 
    next; 
} 
{ 
    one = data[$2]; 
    two = data[$2, toupper($4)]; 
    print $0 ";" (one ? one : "-") ";" (two ? two : "-"); 
} 

然後,調用awk -f program keys.txt data.txt

+0

尼斯與純AWK解決方案,但是,對我來說它不起作用?: ./b:線1:語法錯誤鄰近意外的標記'}」 ./b:第1行:'BEGIN {FS = 「;」 ; }' – Markus

+0

@Markus哪個版本的'awk'? –

+0

GNU awk中4.0.1 順便說一句,我沒有看到,其中輸入文件(data.txt中和keys.txt)在你的解決方案? – Markus

0

簡單的腳本可能會滿足您的要求。使用awk解析並提取data.txt中的鍵。您可以在keys.txt中找到相應的鍵值。

#!/bin/bash                                                 

while read i; do 

    echo $i | awk '{printf "%s;",$1}' 
    key_no=$(echo $i | awk -F';' '{print $2}') 
    key_a_b=$(echo $i | awk -F';' '{print $4}') 

    grep $key_no keys.txt | awk -v key="$key_a_b" -F';' '{ 
     if (key=="KeyA") {printf "%d;%d\n",$2,$4} 
     if (key=="KeyB") {printf "%d;%d\n",$2,$6} 
    }' 

    [ ${PIPESTATUS[0]} -ne 0 ] && echo "-;-" 

done < data.txt 
+0

謝謝,這是一個非常棒的解決方案,它將awk與bash結合在一起。 :) – Markus

+1

不,這是一個可怕的想法,幷包含多個隱患的錯誤。請參閱[爲什麼要使用shell循環處理文本被認爲是不好的練習](https://unix.stackexchange.com/questions/169716/why-is-using-a-shell回答到處理文本被認爲是不好的做法),以回答這個問題中的一些問題,但不是全部。 –

相關問題