awk处理合并两个文件,急...
文件1
116 t1
117 t2
118 t3
文件2
116 1000
117 1500
118 800
我想要的结果是
文件2中的第一个字段即(116,117,118)和文件1中的第一个字段即(116,117,118)每行进行对比如果相同的话 替换成下面这样的
t1 1000
t2 1500
t3 118
t3 118 写错了 不是118 应该是800
如果要是让1个文件的每行的第二个字段、第三个字段和另外一个文件的第二个字段、第三个字段相减呢
file1 :
a 2 3
b 4 5
file2:
a 5 6
b 8 9
想要的结果是
a 3 3
b 4 4 展开
假设现有下面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
如果要是让1个文件的每行的第二个字段、第三个字段和另外一个文件的第二个字段、第三个字段相减呢
file1 :
a 2 3
b 4 5
file2:
a 5 6
b 8 9
想要的结果是
a 3 3
b 4 4
下面这个命令展示的相应字段相减的绝对值
awk 'NR==FNR{a[FNR]=$2;b[FNR]=$3}NR!=FNR{c[FNR]=($2-a[FNR]<0?a[FNR]-$2:$2-a[FNR]);d[FNR]=(b[FNR]-$3<0?$3-b[FNR]:b[FNR]-$3);print $1,c[FNR],d[FNR]}' file1 file2
如果第一字段需要比对,
像前面一样在外围加上条件.