2013-04-25 39 views
0

我有兩個數據文件,他們每個人都有3列。如何將這兩個文件的第三列中的相應元素分開,並將其寫入另一個Linux或awk文件中。在Linux中的兩個不同的文件做數學

Experiment Replica Mean 
General0 0 408.5 
General0 1 461.162 
General0 2 428.23 
General0 3 373.771 
General0 4 396.243 

Experiment Replica Mean 
General0 0 124.674 
General0 1 142.017 
General0 2 145.206 
General0 3 118.493 
General0 4 126.985 

Experiment Replica Mean 
General0 0 124.674/408.5 
General0 1 
General0 2 
General0 3 
General0 4 

回答

3
awk 'FNR==NR{a[$1,$2]=$3;next}FNR==1{print;next}{print $1,$2,$3/a[$1,$2]}' f1 f2 
Experiment Replica Mean 
General0 0 0.3052 
General0 1 0.307955 
General0 2 0.339084 
General0 3 0.31702 
General0 4 0.320473 

提示:column -t是您的輸出格式化成一個表格一個很好的工具:

awk .... | column -t 
Experiment Replica Mean 
General0 0  0.3052 
General0 1  0.307955 
General0 2  0.339084 
General0 3  0.31702 
General0 4  0.320473 

說明:

FNR==NR {   # FNR==NR is only true in the first file 
    a[$1,$2]=$3  # Build array, keys are field 1 and 2, value is field 3 
    next    # Skip to the next line in the file 
} 
FNR==1 {    # If we are on the first line in the second file 
    print   # Print the line 
    next    # Go grab the next line 
} 
{ 
    x=$3/a[$1,$2] # Do the math (the value of a[$1,$2] is $3 from file1) 
    print $1,$2,x # print the output 
} 

要以這種形式運行腳本將其保存到文件script.awk並執行awk -f script.awk f1 f2

+0

你能解釋一下這個代碼因爲我需要將第三列乘以100. – user2312186 2013-04-25 16:13:40

+0

@ user2312186我已經添加了帶有註釋的腳本的長版本。希望這是明確的。乘法運算很簡單:x =($ 3/a [$ 1,$ 2])* 100'。如果這個答案解決了你的問題,請考慮接受它。 – 2013-04-25 16:23:46

1

假設相應的記錄發生在這兩個文件中相同位置,可以將文件粘貼在一起

paste file1.txt file2.txt | 
awk '/Mean/{print($1, $2, $3)} ! /Mean/ {print($1, $2, $6/$3)}' 

Experiment Replica Mean 
General0 0 0.3052 
General0 1 0.307955 
General0 2 0.339084 
General0 3 0.31702 
General0 4 0.320473 

這裏的sudo_O的上述的優雅版:

paste file1.txt file2.txt | awk '{print $1,$2,/Mean/?$3:$6/$3}' 
+0

* F.Y.I *打印不是'awk'中的函數。 – 2013-04-25 16:24:36

+0

@sudo_O,我在'GNU Awk 4.0.1'上測試過它,它工作正常。 – iruvar 2013-04-25 16:26:30

+0

我沒有說你的腳本是無效的,我只是指出括號是多餘的,因爲'print'是'awk'中的一個語句而非函數。您正在打印與($ 1,$ 2,$ 3)相同的'($ 1,$ 2,$ 3)'。 – 2013-04-25 16:30:55

相關問題