2016-11-25 72 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