如何通过awk中的临时公共列连接两个CSV文件?

如何通过awk中的临时公共列连接两个CSV文件?,awk,Awk,我有两个CSV文件,格式为 文件1 文件2 我使用了awk作为 awk -F, 'NR==FNR{a[$1]=$0;next} ($1 in a){print a[$1]","$2 }' file1.csv file2.csv 生产 A,44,7 A,21,7 B,65,4 C,79,11 a[$1]从file1打印整行。如何省略两个文件中的第一列(第一列仅用于匹配第二列)以生成: 44,7 21,7 65,4 79,11 换言之,如何将第一个文件中的列传递到打印块,就像第二个文件中的$2

我有两个CSV文件,格式为

文件1

文件2

我使用了
awk
作为

awk -F, 'NR==FNR{a[$1]=$0;next} ($1 in a){print a[$1]","$2 }' file1.csv file2.csv
生产

A,44,7
A,21,7
B,65,4
C,79,11
a[$1]
file1
打印整行。如何省略两个文件中的第一列(第一列仅用于匹配第二列)以生成:

44,7
21,7
65,4
79,11

换言之,如何将第一个文件中的列传递到打印块,就像第二个文件中的
$2
那样?

请您尝试以下内容,仅在显示的样本上进行测试和编写

awk 'BEGIN{FS=OFS=","} FNR==NR{a[$1]=$2;next} ($1 in a){print $2,a[$1]}' file2 file1
说明:添加上述内容的详细说明

awk '                     ##Starting awk program from here.
BEGIN{                    ##Starting BEGIN section from here.
  FS=OFS=","              ##Setting field and output field separator as comma here.
}
FNR==NR{                  ##Checking condition FNR==NR which will be TRUE when file2 is being read.
  a[$1]=$2                ##Creating array a with index $1 and value is $2 from current line.
  next                    ##next will skip all further statement from here.
}
($1 in a){                ##Statements from here will be executed when file1 is being read and it's checking if $1 is present in array a then do following.
  print $2,a[$1]          ##Printing 2nd field and value of array a with index $1 here.
}
' file2 file1             ##Mentioning Input_file names here.
所示样本的输出如下

44,7
21,7
65,4
79,11


第二种解决方案:更通用的解决方案,考虑到您的两个输入文件可能有重复项,在这种情况下,它会将输入文件1的第一个值打印到输入文件2的第一个值,依此类推

awk '
BEGIN{
  FS=OFS=","
}
FNR==NR{
  a[$1]
  b[$1,++c[$1]]=$2
  next
}
($1 in a){
  print $2,b[$1,++d[$1]]
}
' file2 file1

您可以使用join命令连接它们,并选择要在输出中包含的字段:

kent$  join -t',' -o 1.2,2.2 file1 file2
44,7                                         
21,7
65,4
79,11

如果您的文件包含重复的密钥,例如文件1中的
A
,则您的方法将不起作用。
$2
a[$1]=$2
中的角色是什么?我只是想学习。@Googlebot当然会在一分钟或2分钟内添加详细的解释。聪明的解决方案(第二个),你可以省略
a
数组。要检查多维数组,您可以在mdArray中执行
(idx1、idx2、idxN)
没问题,您提供的许多awk解决方案都很棒!如果我没有记错的话,m-d阵列是awk标准的东西。不过,我不知道它是不是从一开始就推出的。顺便说一句,gawk的
a[i][j]
也非常方便。但是忘记了它的名字:多数组?嵌套数组?或者随便什么+1的解释,Ravinder。我已经做了一些更正,如果我做错了什么,请告诉我。
join
在加入之前不需要排序吗?这没什么大不了的,只是为了确定一下。@Googlebot不,join命令不强制要求排序。当然,如果您希望得到一个已排序的连接输出,您可能需要进行排序。很好,您的解决方案非常有效,但我不得不接受另一个答案,因为问题是专门针对
awk
。谢谢,你的简单解决方案会有很大帮助。@Googlebot没问题。在这种特殊情况下,join更容易,因为它处理dup。例如,R.S.的awk答案是明智的。
awk '
BEGIN{
  FS=OFS=","
}
FNR==NR{
  a[$1]
  b[$1,++c[$1]]=$2
  next
}
($1 in a){
  print $2,b[$1,++d[$1]]
}
' file2 file1
kent$  join -t',' -o 1.2,2.2 file1 file2
44,7                                         
21,7
65,4
79,11