cat 1.txt

张三|000001

李四|000002

cat 2.txt

000001|10

000001|20

000002|30

000002|15

cat 3.txt

000001|10

000001|20

000002|30

000002|15


结果:

张三|000001|10

张三|000001|20

李四|000002|30

李四|000002|15

 

 

解决方法:

方法一:

awk -F'|' 'ARGIND==1{a[$2]=$0} ARGIND==2 {print a[$1]FS$2 }' 1.txt  2.txt

解析:ARGIND表示awk正在处理的文件(文件用1,2,3…来表示,例如1代表1.txt),ARGIND==1处理第一个文件(1.txt),将每条记录赋值给数组aARGIND==2处理2.txt文件,无条件执行{print a[$1]FS$2},此时$1为第二个文件的第一个字段与读取第一个文件时时的数组下标$2相同,因此可以读读到数组a的值。

假设:如果2.txt中存在记录的$1字段,在1.txt中没有对应的记录,如3.txt,上面的方法会有错误的结果,可以用下面的方法:

awk -F'|' 'ARGIND==1{a[$2]=$0} ARGIND==2 && ($1 in a){print a[$1]FS$2 }' 1.txt  3.txt

解析:通过增加判断条件:($1 in a),当处理第二个文件3.xtx的时候判断$1是否在数组a(读取第一个文件1.txt时候生成的数组)中。

方法二:通过NRFNR来实现类似ARGIND的功能

awk -F'|' 'NR==FNR{a[$2]=$0} NR>FNR && ($1 in a){print a[$1]FS$2 }' 1.txt  3.txt

解析:NR,表示awk开始执行程序后所读取的数据行数.
FNR
NR类似,但是awk每打开一个新文件,FNR会重新计数

方法三:通过FILENAME实现类似ARGIDN功能

awk -F'|' 'FILENAME=="1.txt"{a[$2]=$0} FILENAME=="3.txt" && ($1 in a){print

a[$1]FS$2 }' 1.txt  3.txt

解析:FILENAME表示awk处理的文件名