2015-08-26 11 views
1

我想有一種方法可以將一個文件相應地過濾到另一個文件,但考慮到每個文件的不同範圍,因爲數量不同,第1列的名稱也不同。因此,例如第2列和第4列可以在50的範圍內變化,而第3列和第5列分別爲0.05和0.005。讓文件按照每列進行相應的過濾,並使用另一個列文件的值範圍

文件1

ddd 10 2 0.3 4 0.02 
ccc 250 22 0.2 2 0.04 
aaa 10 10 0.10 10 0.02 
xxx 12 12 0.12 2 0.01 
showman 150 15 0.15 200 0.003 
porco 15 100 0.15 15 12 

文件2

super 120 11 0.12 150 0.005 

輸出

showman 150 15 0.15 200 0.003 
+0

你嘗試過什麼到目前爲止打電話?這是你必須做的許多不同版本的文件2和/或每個列的公差範圍會有所不同嗎? – Simon

+0

如果只有文件2的幾個不同版本,我建議直接將它作爲一個''awk'腳本來寫入'file 1'作爲輸入。如果可能有許多不同版本的'file 2',解決這個問題的一種方法是編寫一個'awk'腳本,它將'file 2'作爲輸入並生成一個腳本'file2.awk',提供'file 1'。 – Simon

+0

我嘗試了一些awk命令,但問題是我不知道如何爲一個文件的每列創建一個變量並使用這些變量來創建範圍並在其他文件中搜索值 – Jontexas

回答

2

這與Simon的解決方案類似,但它避免了兩次調用awk。

function abs(x) {return ((x < 0.0) ? -x : x)} 

BEGIN { 
    tol[2]=50 
    tol[3]=5 
    tol[4]=0.05 
    tol[5]=50 
    tol[6]=0.005 
} 

FNR==NR { 
    for (i=2; i<=NF; i++) 
     target[i]=$i 
} 

FNR < NR { 
    for (i=2; i<=NF; i++) 
     if (abs($i - target[i]) > tol[i]) 
      next 
    print 
} 

使用awk -f match.awk file2 file1

1

下面的腳本,其中我稱爲filterrange,從file2.txt生成awk腳本filterrange.awk和然後運行這awk腳本做過濾:

#!/bin/sh 
awk 'BEGIN { r[2] = 50; r[3] = 5; r[4] = 0.05; r[5] = 50; r[6] = 0.005 } 
     { print "function abs(x){return ((x < 0.0) ? -x : x)}" 
     for (i = 2; i <= NF; i++) { 
      printf("abs($%s-%s)<=%s", i, $i, r[i]) 
      if (i < NF) printf(" && ") 
      } 
     }' <$1 >filterrange.awk 
awk -f filterrange.awk <$2 

abs()功能是從Absolute value in awk doesn't work?

運行這個外殼腳本給出以下結果:

$ filterrange file2.txt file1.txt 
showman 150 15 0.15 200 0.003 

範圍公差被固定在此處示出的模板awk腳本,但它們可以從一個單獨的文件中使用類似的方法容易地產生,如果需要的話。

+0

出錯了= \ 我得到的唯一事情是: '的bash filterrange compare.txt permut1.txt AWK:在源極線2源文件filterrange.awk 上下文語法錯誤是 \t ABS($ 2-120)<= 50 && abs($ 3-11)<= 5 && abs($ 4-0.12)<= 0,05 && abs($ 5-150)<=50 && > >> abs($ 6-0.005)<= 0,<<< awk:救助在源代碼行2' – Jontexas

+0

你的腳本在我的朋友機器上工作,但是不是我的,而@chthonicdaemon的命令是我的,而不是他的。 Jontexas

+0

語法錯誤的結果來自於'file2.txt'中的第六列,當它應該是'0.005'(有句點)時,它是'0,005'(用逗號)。 @chthonicdaemon的答案更簡單,所以我會推薦它,但在某些情況下,我的解決方案可能運行得更快。我必須要確定基準。無論如何,在尋求快速解決方案之前,最好有一個解決方案。 – Simon

相關問題