如何使用awk使用两个文件进行替换?

时间:2016-03-31 19:20:05

标签: bash awk

我正在尝试使用awk在第一个txt电子表格中根据“标题”列进行搜索,如果匹配,则使用此行更改第二个文件。

我第一次尝试使用comm,但它不起作用。 我找不到任何类似的话题。有人能帮助我吗?

FILE1

Title   score   atividade
ZINC79350772    -8.435  1
ZINC71820127    -8.371  1
ZINC65370023    -8.265  1
ZINC13151660    -8.203  1

FILE2

ZINC79350772 -8.435 0
ZINC71820127 -8.371 0
ZINC65370023 -8.265 0
ZINC78807290 -8.256 0

期望的输出

ZINC79350772 -8.435 1
ZINC71820127 -8.371 1
ZINC65370023 -8.265 1
ZINC78807290 -8.256 0

2 个答案:

答案 0 :(得分:2)

试试这个测试版本:

(cat FILE1; printf "NEXT_FILE\n"; cat FILE2) | awk '{if ($1 ~ /NEXT_FILE/) {secondfile=1;} else if (!secondfile && NR>1) {score[$1]=$2; actividade[$1]=$3;} else if (secondfile) { if (score[$1]) {$2=score[$1]; $3=actividade[$1];} print;}}' > DESIRED_OUTPUT

cat DESIRED_OUTPUT
ZINC79350772 -8.435 1
ZINC71820127 -8.371 1
ZINC65370023 -8.265 1
ZINC78807290 -8.256 0

正在使用关联数组,如着名的Awk - A Tutorial and Introduction - by Bruce Barnett

中所述

在阅读FILE1时会填充关联数组得分 actividade

当读取FILE2时,如果首先遇到当前标题列,则打印它,否则将打印首先在FILE1中找到的值。

答案 1 :(得分:0)

awk救援!

$ awk 'NR==FNR{a[$1]=$3;next} $1 in a{$3=a[$1]} 1' file1 file2

ZINC79350772 -8.435 1
ZINC71820127 -8.371 1
ZINC65370023 -8.265 1
ZINC78807290 -8.256 0