我有两个 CSV 文件,并尝试根据第一个文件中的第一列与第二个文件中的第三列匹配来合并它们。它们的行没有排序。
文件1.csv:
android,1,2
osx,2,5
文件2.csv:
Converting,:Developer::|[E],android,Exact,,,,8,31
Converting,:Developer::|[E],osx,Exact,,,,8,31
Converting,:Developer::|[E],windows,Exact,,,,8,31
并希望得到以下输出.csv:
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,
我已经尝试过每个例子
awk -F',' 'FNR==NR.....
我可以在这里找到,但似乎无法做到正确。
答案1
你可以用join
这个
join -1 1 -2 3 -t ',' -a 2 -o 2.{1..9} 1.{2..3} <(sort file1.csv) <(sort file2.csv)
-1
并-2
指定要比较文件中的哪个字段
-t
指定用于字段的分隔符
-a 2
说要打印<file2>
不匹配的
-o
行配置输出基于<file>.<field>
答案2
完成工作的最佳工具可能是join
但既然你提到了awk
,这是另一种方法:
$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2;b[$1]=$3; next}{print $0,a[$3],b[$3]}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,
它使用两个数组a
和b
,分别将第一个字段file1
作为键,将第二个字段和第三个字段作为值。确保FNR==NR{...next}
仅第一个文件保存在数组中。然后,在处理第二个文件时,我们打印文件的行 ( $0
),后跟数组a
和中与其第一个字段对应的值b
。将-vOFS=","
输出字段分隔符设置为逗号,以便我们获得所需的输出格式。
或者,稍微神秘一点:
$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2","$3;next}{print $0,(a[$3]?a[$3]:",")}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,