awk 比较两个文件常用语法
2021-01-06 本文已影响0人
PETJO
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