awk对比文本
如下所示,假如文本如下,一共三列,第一列表示水果的名称,第二列表示英文表示,对于a中的第三列表示合格的数量,b中的第三列表示不合格的数量,现在的需求就是将同一水果的合格数量和不合格数量放到一个文本中
(base) localhost:~ hanerli$ cat a.txt
苹果 Apple 10
梨 pear 8
柠檬 lemon 4
桃子 peach 18
(base) localhost:~ hanerli$ cat b.txt
桔子 orange 3
柠檬 lemon 1
苹果 Apple 8
桃子 peach 9
梨 pear 2
这里利用awk来对比文本
awk 'NR==FNR{a[$1$2]=$3;next} NR>FNR{n=a[$1$2];num=0;if(n>0)num=n;print $0,num}' a.txt b.txt > c.txt
(base) localhost:~ hanerli$ cat c.txt
桔子 orange 3 0
柠檬 lemon 1 4
苹果 Apple 8 10
桃子 peach 9 18
梨 pear 2 8
解析一下:
- NR,FNR用来计录行数。在第一个文件中值是相同的,当换文件时,NR继续增加,FNR从1计数,所以可以利用NR,FNR判断属于哪个文件
- $1,$2表示文件的第一列还是第而列,当遍历第一个文件时,将合格数量都放到数组a中去,然后到第二个文件中, 根据键值取出来,如果没有,数量就是零
- print $0表示输出当前文件的每一行
细水长流~