2016-11-25 74 views
2

我有兩個文件k1和k2,我試圖根據公共密鑰'書名'合併兩個文件。如何使用awk中的公用密鑰合併兩個文件?

K1

John | Dreaming of Day | IEEEJournal 
Akon | Dreaming of Night | ACMJournal 

K2

Dreaming of Day | Fiction 
Dreaming of Night | Non-Fiction 

KOUT:

:基於圖書即 Dreaming of Day的名稱和 Dreaming of Night

John | Fiction | IEEEJournal 
Akon | Non-Fiction | ACMJournal 

我寫了下面的awk腳本應該合併

awk -F"|" 'BEGIN{OFS="|"}FNR==NR{a[$1$2]=$3;next}($1$2 in a && $3=$3"|"a[$1$2])' k1 k2 

但它似乎並不奏效。

回答

1

陣列的解決方案gawk使用數組

gawk 'BEGIN{FS=" \\| "; OFS=" | "} 
    FNR==NR{d[$2][1] = $1; d[$2][3] = $3; next} 
    $1 in d{print d[$1][1], $2, d[$1][3]} 
    ' k1 k2 

它不是awk解決方案,使用sedjoin

join <(sed 's/ | /|/g' k1) <(sed 's/ | /|/g' k2) -1 2 -2 1 -t'|' -o '1.1 2.2 1.3' | sed 's/|/ | /g' 

John | Fiction | IEEEJournal 
Akon | Non-Fiction | ACMJournal 

編輯AWK版

awk 'BEGIN{FS=" [|] "; OFS=" | "} 
    FNR==NR{d1[$2] = $1; d3[$2] = $3; next} 
    $1 in d1{print d1[$1], $2, d3[$1]} 
    ' k1 k2 
+0

感謝您的解決方案,但我gettintin g error awk:源代碼行1的語法錯誤 上下文是 \t BEGIN {FS =「\\ | 「; OFS =」| 「} >>> FNR == NR {d [$ 2] [<<< awk:在源代碼行1的非法聲明 awk:源代碼行1的非法聲明 – Techiee

+0

您能告訴我錯誤,您的awk版本是什麼使用? –

+0

awk -Win 2 -/dev/null || awk --version awk版本20070501 – Techiee

1
join -12 -21 -t\| k1 k2 
Dreaming of Day |John | IEEEJournal| Fiction 
Dreaming of Night |Akon | ACMJournal| Non-Fiction 

注意事項:

  • 鍵,因爲沒有斷鍵控默認情況下第一列,空白的問題也同樣有序
  • 。所以修剪或墊鑰匙匹配

從輸出

join -12 -21 -t\| k1 k2 | cut -f2- -d\| 
John | IEEEJournal| Fiction 
Akon | ACMJournal| Non-Fiction 
+0

非常感謝Tomc的回答。 +1! – Techiee

2

您可以構建sed論點

sed 's/\(.*\)|\(.*\)/s# \1#\2 #/' k2 

這些參數可以在另一個sed命令用來省略鍵通過

sed -f <(sed 's/\(.*\)|\(.*\)/s# \1#\2 #/' k2) k1 
+0

感謝Walter的回答。 – Techiee