有两个文件,A, B
想要执行的操作是:当A每一行文件的第一列,第三列和第五列分别于B文件的第二列,第四列和第六列一致时,将B文件的第8列替换为A文件的第七列
初步设想用有for循环的awk命令,但不清楚怎么表示“所属”的逻辑关系,请求帮助!谢谢!
[root@mypy opt]# cat A
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
[root@mypy opt]# cat B
1 1 3 3 5 5 7 8
1 1 3 3 5 5 7 8
[root@mypy opt]# cat test.sh
#!/bin/bash
awk '{print $1,$3,$5}' /opt/A > a.txt
awk '{print $2,$4,$6}' /opt/B > b.txt
test=$(diff a.txt b.txt)
if [ -z $test ];then
awk 'FNR==NR{a[NR]=$8;next}{$7=a[FNR]}1' B A > C
else
exit 0
fi
[root@mypy opt]# cat C
1 2 3 4 5 6 8 8
1 2 3 4 5 6 8 8
最终C文件就是你要的结果
[root@kanq ~]# cat A
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
[root@kanq ~]# cat B
11 1 13 3 15 5 17 18 19
11 1 13 3 15 5 17 18 19
11 1 13 3 15 5 17 18 19
[root@kanq ~]# cat BNew
11 1 13 3 15 5 17 7 19
11 1 13 3 15 5 17 7 19
11 1 13 3 15 5 17 7 19
全使用awk 实现 如下:
awk -v lin=$(cat B|wc -l) '{
if(NR==FNR){
for(k=1;k<=NF;k++){
a[FNR-1,k-1]=$k;
}
next
}
else{
for(k=1;k<=NF;k++){
b[FNR-1,k-1]=$k;
}
}
if(lin==FNR){
for(i=0;i<3;i++){
for(k=0;k<lin;k++){
if(a[k,i*2]!=b[k,i*2+1]){
next
}
}
}
for(i=0;i<lin;i++){
b[i,7]=a[i,6]
}
for (i=0;i<lin;i++){
for(k=0;k<NF;k++){
printf b[i,k]
if (k<NF-1){
printf" "
}
}
print ""
}
}
}' A B >BNew