Shell awk两个文件的对比 NR和FRN

 

使用awk对两个文件的对比:code

认识:NR和FRN作用域

NR:表示当前记录数
FNR:也表示当前记录数,可是FNR的做用域只在一个文件内.若是从新打开文件,FNR会从1开始.

文件a
aaa
bbb
ccc

文件b
eee
fff

awk '{print NR;print FNR;print $0;}' a  #结果以下
    1
    1
    aaa
    2
    2
    bbb
    3
    3
    ccc
awk '{print NR;print FNR;print $0;}' a b #结果以下
    1
    1
    aaa
    2
    2
    bbb
    3
    3
    ccc
    4
    1
    aaa
    5
    2
    ccc
    6
    3
    ddd
**结论:看懂了么,awk在处理两个文件的时候,NR是自动的连接在第一个文件id的后面,FNR是从1从新的开始**
  • 当b文件只用一列,a文件有多列。b文件中的当前列和a文件中的其中的一列进行对比
a文件:
111 aaa
222 bbb
333 ccc
444 ddd
555 eee

b文件
aaa
ccc
ddd


判断的方式以下:
awk  'NR==FNR{a[$0]}NR>FNR{ if($2 in a)    print $0}' b a #找出两文件中相同的值
awk  'NR==FNR{a[$0]}NR>FNR{ if(!($2 in a)) print $0}' b a #找出文件2中不一样的值
  • 当b文件有多列,a文件有多列。b文件中一行和a文件中的其中的一行进行对比
a文件:
111 aaa
222 bbb
333 ccc
444 ddd
555 eee

b文件:
111 aaa
222 bbb
444 ddd


判断的方式以下:
awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]' b a  #找出两文件中彻底同的行
awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' b a #找出两文件中不一样的行
  •  当文件中有多列, 把文件中也有多列, 而且么有两行是相同的进行对比
aaa文件:
111	aaa
222	bbb
333	ccc
444	ddd
555	eee
555	aaa
555	ccc

bbb文件:
aaa	a1
ccc	c1
ddd	d1


判断的方式以下:
awk 'NR<=FNR{a[$1]=$2}NR>FNR{print $0,a[$2]}' bbb aaa 
注释:是将aaa文件中的第二列和bbb文件中的第一列进行对比
若是相同的话就在aaa文件的后面把bbb文件中的第二列给添加上去
结果以下:
111	aaa a1
222	bbb 
333	ccc c1
444	ddd d1
555	eee 
555	aaa a1
555	ccc	 c1
相关文章
相关标签/搜索