我有两个文件 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 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
和mawk
:
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