awk 比較兩個文件常用語法

1. 制作文件file1, file2, file3, file4, file5;"\t"分隔符;觀察文件格式特點(diǎn)

cat > file1
aaa 001 A                                                                         
bbb 002 B
ccc 003 C
ddd 004 D
eee 005 E

cat > file2
aaa 001 A                                                                         
bbb 002 B

cat > file3
aaa                                                                         
bbb 
ccc 
ddd 
  
cat file4
aaa 001 100                                                                         
bbb 002 90
ccc 003 80
ddd 004 70
eee 005 60

cat file5
A   aaa 001 100                                                                       
B   bbb 002 90
C   ccc 003 80
D   ddd 004 70
E   eee 005 60

2. awk是按行讀入文件內(nèi)容的,因此awk按行(字段)比較兩個文件的相同行或者不同行

# 1.同時在file1和file2中存在的行
# 邏輯:當(dāng)文件1時,將文件1按行寫入數(shù)組;當(dāng)文件2時,按行判斷文件2是否在數(shù)組中,如果在,打印該行并輸出到common文件。
awk 'BEGIN{FS=OFS="\t"} {if(NR==FNR){array[$0]} else{if($0 in array) {print $0}}}' file1 file2 

awk 'BEGIN{FS=OFS="\t"} {if(ARGIND==1){array[$0]} else{if($0 in array) {print $0}}}' file1 file2

awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$0]} ARGIND==2{if($0 in array) {print $0}}' file1 file2

# 2.只在一個文件中有的行
# 邏輯:當(dāng)文件1時,將文件1按行寫入數(shù)組;當(dāng)文件2時,按行判斷文件2是否在數(shù)組中,如果在,刪除數(shù)組中該條記錄;打印數(shù)組中的值。
awk 'BEGIN{FS=OFS="\t"} {if(NR==FNR){array[$0]} else{if($0 in array) {delete array[$0]}}} END{for(i in array) {print i}}' file1 file2

awk 'BEGIN{FS=OFS="\t"} {if(ARGIND==1){array[$0]} else{if($0 in array) {delete array[$0]}}} END{for(i in array) {print i}}' file1 file2

# 3.比較兩個文件一列相同,打印目標(biāo)行數(shù)據(jù),注意構(gòu)建數(shù)組的語法形式多樣"++";"next"
awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1]} ARGIND==2{if($1 in array){print $0}}' file3 file1

awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1]++} ARGIND==2{if($1 in array){print $0}}' file3 file1

awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1];next} ARGIND==2{if($1 in array){print $0}}' file3 file1

# 4.比較兩個文件(列數(shù)列號相同),指定多列相同時,打印目標(biāo)數(shù)據(jù)
awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1,$2];next} ($1,$2) in array' file1 file4

awk 'BEGIN{FS=OFS="\t"} ARGIND==1{a[$1]; b[$2]; next} $1 in a && $2 in b' file1 file4

# 5.比較兩個文件(列數(shù)列號不相同),指定多列相同時,打印目標(biāo)數(shù)據(jù)
awk 'BEGIN{FS=OFS="\t"} ARGIND==1{a[$1]; b[$2]; next} $2 in a && $3 in b' file1 file5

awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1,$2];next} ($2,$3) in array' file1 file5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容