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表示輸出當前文件的每一行
細水長流~