2016-03-31 40 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

工作得很好謝謝你! –