2012-10-14 104 views
0

文件,我有兩個文件:AWK-合併基於關鍵

的1.txt

jeden:AA 
dwa:BB 
trzy:CC 
cztery:DD 
piec:EE 
szesc:FF 
ttttttt:to 
siedem:GG 
osiem:HH 
dziewiec:II 
dziesiec:JJ 

2.txt

JJ:jola 
EE:ela 
BB:baska 
FF:flora 
II:irga 
AA:adam 
to:llll 
DD:darek 
CC:celina 
HH:hela 
GG:gosia 

我想這兩個文件合併基於關鍵。預期結果:

jeden: adam 
dwa: baska 
trzy: celina 
cztery: darek 
piec: ela 
szesc: flora 
ttttttt: llll 
siedem: gosia 
osiem: hela 
dziewiec: irga 
dziesiec: jola 

我嘗試這樣做:

$ awk -F ":" '{getline a < "2.txt" split(a, b, ":"); if($2==b[1]) print $1":", b[2]}' 1.txt 
ttttttt: llll 

謝謝您的幫助。

回答

2

方式一:

awk ' 
    BEGIN { 
     FS = "[: ]*"; 
     OFS = ":"; 
    } 
    FNR == NR { 
     keys[ $1 ] = $2; 
     next; 
    } 
    { 
     printf "%s%s %s\n", $1, OFS, ($2 in keys) ? keys[ $2 ] : "???"; 
    } 
' 2.txt 1.txt 

國債收益率:

jeden: adam 
dwa: baska 
trzy: celina 
cztery: darek 
piec: ela 
szesc: flora 
ttttttt: llll 
siedem: gosia 
osiem: hela 
dziewiec: irga 
dziesiec: jola 
+0

謝謝,很好的解決方案。你還用getline寫另一個解決方案嗎? – Tedee12345

1

您可以通過多個步驟完成此操作。

$ gawk -F: '{print $2 " " $1}' 1.txt | sort > 1.1.txt 
$ gawk -F: '{print $1 " " $2}' 2.txt | sort > 2.1.txt 
$ paste -d' ' 1.1.txt 2.1.txt | gawk '{print $2 ": " $4}' 
jeden: adam 
dwa: baska 
trzy: celina 
cztery: darek 
piec: ela 
szesc: flora 
siedem: gosia 
osiem: hela 
dziewiec: irga 
dziesiec: jola 
ttttttt: llll 
+0

謝謝,很好的解決 – Tedee12345

1

我會使用的coreutils join此:

join -t: -1 2 -2 1 -o 1.1 2.2 \ 
    <(sort -t: -k2,2 1.txt | sed -r 's/\s+$//') \ 
    <(sort   2.txt | sed -r 's/\s+$//') 

結果:

jeden:adam 
dwa:baska 
trzy:celina 
cztery:darek 
piec:ela 
szesc:flora 
siedem:gosia 
osiem:hela 
dziewiec:irga 
dziesiec:jola 
ttttttt:llll 

如果你真的想冒號後的額外的空間追加| sed 's/:/& /'到命令

+0

謝謝,很好的解決方案 – Tedee12345