在unix中使用awk对文件执行类似sql的左外连接

在unix中使用awk对文件执行类似sql的左外连接,unix,join,awk,Unix,Join,Awk,我正在尝试根据两个文件中的第一列进行联接 到目前为止,我已经尝试使用以下代码 awk '{if (NR==FNR) {a[$1]=$2; next} if ($1 in a) {print $2"|"$3"|""Found"} if(!($1 in a)) {print $2"|"$3"|""Not Found"}}' file1.txt file2.txt > TARGET.txt file1 file contents 1as.pdf 2as.pdf 3as.pdf 45

我正在尝试根据两个文件中的第一列进行联接

到目前为止,我已经尝试使用以下代码

awk  '{if (NR==FNR) {a[$1]=$2; next} if ($1 in a) {print $2"|"$3"|""Found"}      if(!($1 in a)) {print $2"|"$3"|""Not Found"}}' file1.txt file2.txt > TARGET.txt

file1 file contents
1as.pdf
2as.pdf
3as.pdf
45.pdf
as.pdf

file2 file contents
3ss.pdf 1_2_3_45.csv    4
3s.pdf  1_2_3_45.csv    4
2as.pdf 1_2_3_45.csv    4
1as.pdf 1_2_3_45.csv    4
45.pdf  1_2_3_45_5.csv  1
3.pdf   1_2_3_5.csv 1

但是,由于您没有打印密钥,所以找到了什么,没有找到什么并不十分清楚。也许还保留输出中的第一个字段…

您知道有一个unix命令,名为?yesp@WumpusQ.Wumbley,但要执行连接,文件应按顺序排序,ex:100000的排序行成本更高,我觉得我选择了awk wayHi。你的问题是什么?请阅读并采取行动。PS“更昂贵”是什么意思?你认为成本是多少?建议您研究一下。@philipxy我的目标是使用awk命令进行左外连接,而不是使用join,从其他博客我了解到,在处理100000行文件时,awk比join快。awk不是一种算法。算法和开销的细节很重要。您的程序执行10k x 10k行比较。按排序的Join对每个输出行进行比较,很可能是10k x 10k的一小部分,加上2个排序,每个10k x~log2(10k)=10k x 50比较,另一小部分。内存与文件使用也很重要。表约束也是如此。建议您阅读计算机科学入门教材中的算法成本(复杂性)简介。建议您实际测量。您能解释一下代码中的{a[$1];next}请。将文件1中的
$1
添加到哈希表
a
,以便在扫描文件2时检查是否存在。请注意,您设置为
$2
,该值不存在,即使存在,也不会使用,因此无需分配该值。
$ awk -v OFS='|' 'NR==FNR{a[$1];next} 
                         {print $2,$3,(($1 in a)?"Found":"Not Found")}' file1 file2 

1_2_3_45.csv|4|Not Found
1_2_3_45.csv|4|Not Found
1_2_3_45.csv|4|Found
1_2_3_45.csv|4|Found
1_2_3_45_5.csv|1|Found
1_2_3_5.csv|1|Not Found