awk处理合并两个文件,急...

2025-05-13 21:08:26
推荐回答(2个)
回答(1):

假设现有下面4个文件:

file1:           file2:                                             file3:        file4: 

116  t1       116  1000                                     100 t1     115 600

117  t2       117  1500                                     105 t2     100 700

118  t3       118  800                                       110 t3     110 800

                                                                       115 t4     105 900

                                                                                      200 300

1. 比较file1和file2: (下面是一行命令,非两行)

awk 'FILENAME==ARGV[1]{a[FNR]=$1;b[FNR]=$2};FILENAME==ARGV[2]{for(i=1;i<=length(a);i++){if(a[i]==$1){print b[i],$2}}}' file1 file2 | sort -u

结果:

t1 1000

t2 1500

t3 800

2. 比较file3和file4: (下面是一行命令, 非两行)

awk 'FILENAME==ARGV[1]{a[FNR]=$1;b[FNR]=$2};FILENAME==ARGV[2]{for(i=1;i<=length(a);i++){if(a[i]==$1){print b[i],$2}}}' file3 file4 | sort -u

结果:

t1 700

t2 900

t3 800

t4 600

执行情况见下面截图:

__________________________________________________________________________

补充:    

“我想要的结果是

文件2中的第一个字段即(116,117,118)和文件1中的第一个字段即(116,117,118)每行进行对比如果相同的话 替换成下面这样的 

t1 1000 

t2 1500

t3 118 “

——————————————————————————————————————————

如果不同的话需不需要展示出来?

上面的命令是只展示匹配到的

如果想把  不匹配的也展示出来, 用下面的命令:

awk 'FILENAME==ARGV[1]{a[FNR]=$1;b[FNR]=$2};FILENAME==ARGV[2]{for(i=1;i<=length(a);i++){if(a[i]==$1){$1=b[i]}};print $1,$2}' file3 file4 | sort -u

结果

200 300

t1 700

t2 900

t3 800

t4 600

回答(2):

awk 'NR==FNR{a[$1]=$2}NR!=FNR{print a[$1]" "$2}' file1 file2