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
相關文章
相關標籤/搜索