如何在awk中使用公共键合并两个文件?

如何在awk中使用公共键合并两个文件?

我有两个文件 k1 和 k2,我试图根据公共键“书名”合并这两个文件。

k1

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

k2

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

kout:应该根据书名进行合并,即Dreaming of DayDreaming 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

这似乎适用于gawkmawk

awk -F' *[|] *' -vOFS=' | ' '
  NR==FNR {a[$1]=$2;next} $2 in a {print $1, a[$2], $3}
' k2 k1
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal

答案2

我认为它不起作用的原因是文件 1 的字段 2 不等于文件 2 的字段 1。使用“|”作为分隔符,文件 2 的字段 1 是“Dreaming of Day”,而文件 1 的字段 2 是“Dreaming of Day”。 “做梦”一词之前有一个额外的空格。

我尝试使用 join 命令执行您的示例,但由于存在额外的空间,它不起作用。如果删除字段 2 - 文件 1 的额外空间(或在字段 1 - 文件 2 中添加额外空间),它应该可以工作。

PS1:顺便说一下,使用 join (并通过删除多余的空格),您可以非常接近您想要的结果,而不需要“脚本”:

join --nocheck-order -t"|" -1 2 a.txt b.txt

输出(删除所有 | 前面的所有多余空格后):

Dreaming of Day |John |IEEEJournal|Fiction
Dreaming of Night |Akon |ACMJournal|Non-Fiction

然后你可以剪切 -d'|'必填字段

PS2:总有一种适合您的数据的“经典方式”(无需删除额外的空间)

while IFS="|" read -r line title1 rest; do
title2=$(echo $title1)
genre=$(grep -e "$title2" b.txt |cut -f2 -d"|")
echo $line "|" $genre "|" $rest    
done <a.txt

输出:

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

相关内容