awk 比较两个文件常用语法

1. 制作文件file1, file2, file3, file4, file5;"\t"分隔符;观察文件格式特点

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是按行读入文件内容的,因此awk按行(字段)比较两个文件的相同行或者不同行

# 1.同时在file1和file2中存在的行
# 逻辑:当文件1时,将文件1按行写入数组;当文件2时,按行判断文件2是否在数组中,如果在,打印该行并输出到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.只在一个文件中有的行
# 逻辑:当文件1时,将文件1按行写入数组;当文件2时,按行判断文件2是否在数组中,如果在,删除数组中该条记录;打印数组中的值。
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.比较两个文件一列相同,打印目标行数据,注意构建数组的语法形式多样"++";"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.比较两个文件(列数列号相同),指定多列相同时,打印目标数据
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.比较两个文件(列数列号不相同),指定多列相同时,打印目标数据
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

你可能感兴趣的:(awk 比较两个文件常用语法)