【发布时间】:2019-06-14 08:55:47
【问题描述】:
我知道这个问题已经被问过好几次了。这是一个例子:
Using AWK to merge two files based on multiple columns
如果发生以下匹配,我的目标是打印出 file_b 的第 2、4、5 和 7 列以及 file_a 的第 17 和 18 列: file_a.csv 的第 2、6 和 7 列分别与 file_b.csv 的第 2、4 和 5 列匹配。
但无论我如何尝试,我都无法让它适用于我的情况。这是我的两个文件:
file_a.csv
col2, col6, col7, col17, col18
a, b, c, 145, 88
e, f, g, 101, 96
x, y, z, 243, 222
file_b.csv
col2, col4, col5, col7
a, b, c, 4.5
e, f, g, 6.3
x, k, l, 12.9
输出应如下所示:
col2, col4, col5, col7, col17, col18
a, b, c, 4.5, 145, 88
e, f, g, 6.3, 101, 96
我试过了:
awk -F, -v RS='\r\n' 'NR==FNR{key[$2 FS $6 FS $7]=$17 FS $18;next} {if($2 FS $4 FS $5 in key); print $2 FS $4 FS $5 FS $7 FS key[$2 FS $6 FS $7]}' file_a.csv file_b.csv > out.csv
目前我得到的输出是:
col2, col4, col5, col7,
a, b, c, 4.5,
e, f, g, 6.3,
换句话说,file_a 中的 col17 和 col18 没有显示出来。
昨天我问了一个相关问题,我遇到了换行问题。这得到了回答和解决,但现在我认为这个问题与检查 if 条件有关。
更新: 我正在共享指向实际数据的截断副本的链接。这些文件和实际文件之间的唯一区别是真实文件有数百万行。这些只有 10 个。
【问题讨论】:
-
您的 Input_file(s) 中是否需要
\r字符?如果没有,请先使用tr -d '\r' < Input_file > temp && mv temp Input_file摆脱它们。还打印awk '{print $17,$18}' Input_file看看你得到的输出是期望的,让我们知道吗? -
感谢@RavinderSingh13。请参阅下面我对 Tiw 回答的评论。
标签: csv awk merge text-processing