2016-03-31 38 views
1

我试图使用awk来搜索基于标题列的第一个txt电子表格,如果它匹配,则用此行更改第二个文件。如何使用awk使用两个文件进行替换?

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

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

欢迎来到SO,请展示您的编码工作。 – Cyrus

+0

我不多使用'join',但是我有一种工作方式,但是因为'-e 0'将缺少的零置回:'join -e 0 -o 1.1 1.2 2.3 -a1 file2.txt <(sed 1d file1.txt)' –

回答

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 
+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 

它是使用关联数组,如在得分actividade被填充在读取FILE1著名Awk - A Tutorial and Introduction - by Bruce Barnett

的关联数组说明。

当读取FILE2时,如果第一次遇到当前标题列,则会打印它,否则将打印第一个在FILE1中找到的值。

+1

工作得很好谢谢你! –