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),将每条记录赋值给数组a,ARGIND==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时候生成的数组)中。
方法二:通过NR和FNR来实现类似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处理的文件名
转载于:https://blog.51cto.com/360537539/715033