2017-06-08 17 views
-4

我想將列2中的值與列3中的值進行比較。該比較不在同一行的第2列和第3列中的值之間。 用於比較的條件是:比較值與同一個字符串關聯

(1)值在COL2一排與另一行中第3欄第值,當這些行在列相同的字符串進行比較1.

(2)僅當第1列中的字符串重複至少兩次時才進行比較。

(3)在第2欄值是大於value在第3列中不同的行中,當兩行具有相同的列串1.

一個例子的輸入文件是:

 
john 0 100 
john 120 200 
smith 1 400 
claris 300 500 
claris 510 700 
claris 300 500 
dexter 10 400 
dexter 100 300 
sam 200 300 
sam 310 500 
tom 100 300 
bruce 200 500 
bruce 520 900 

期望的輸出

 
john 0 100 
john 120 200 
claris 300 500 
claris 510 700 
claris 300 500 
sam 200 300 
sam 310 500 
bruce 200 500 
bruce 520 900 

col1中'dexter'的行未打印。 'dexter'存在於兩行中,但col 2中的值小於其他行中的col3中的值,即,10小於300並且100小於400.具有'bruce'的行被打印,因爲;因爲第二排和第二排中col3中有大於500的col 2中有520個。

我用awk試過了,下面是一個例子。看起來像我不能找出第一通過印刷只是重複線,然後比較所述相關值中的另一行,其具有相同的字符串在COL1

awk -F "\t" 'NR==FNR{a[$1]++; b[$1]=$2; c[$1]=$3;next} {for (i in b) if (a[$1] >2 && b[i]>c[i]) print}' test.file test.file 

我還試圖將其在步驟與COL3比較COL2。 我無法弄清楚如何比較與同一個字符串關聯的值。

+1

爲什麼您解決* TEST.FILE *兩次,在命令行?我不明白哪個規則保留* dexter * out!?您寫道:*第2列中的值大於第3 *列中的值,但在您的示例中,我沒有看到與此匹配的一行。 –

+1

我明白你爲什麼要把這個文件放兩次,但是@ F.Hauri的其他問題是相當重要的:哪一個規則保持了敏捷?_和「_You寫道:第2列中的值大於第3列中的值,但是我沒有在您的示例中,請參見與此匹配的一行._「 – jas

+0

要使用數組重複打印第1列中重複至少兩次的字符,我將文件傳遞給了兩次。我同意有更多的方法。對不起原來的問題不清楚。我需要比較列2和列3中跨行的值,只要它們與列1中的相同字符串相關聯。 – Amit

回答

1

正如您在嘗試中所做的那樣,我們在文件上做了兩遍。首先,我們爲每個人捕獲出現的次數,以及它們對於column_2的最大值和對於column_3的最小值。對於第二遍我們只是測試打印的給定條件。

NR == FNR { 
    if (a[$1]) { 
     # we've seen this value before in column_1 
     # update the min and max values if necessary 
     if ($2 > col2max[$1]) col2max[$1] = $2 
     if ($3 < col3min[$1]) col3min[$1] = $3 
    } 
    else { 
     # first time we've seen this value in column_1 
     # initial the min and max to the current values 
     col2max[$1] = $2 
     col3min[$1] = $3 
    } 
    ++a[$1] 
    next 
} 
a[$1] > 1 && col2max[$1] > col3min[$1] 

輸出:

$ awk -f a.awk file file 
john 0 100 
john 120 200 
claris 300 500 
claris 510 700 
claris 300 500 
sam 200 300 
sam 310 500 
bruce 200 500 
+0

'__/__'用於解碼OP的要求... – karakfa

+0

我已經添加了一些註釋代碼。如果您需要更多信息來了解它,請讓我知道。 – jas

+0

非常感謝您提供了一個完美的工作代碼並瞭解我的問題。想不到分配最小值和最大值。爲了更好地理解代碼,你能否使用'if'和'else'來解釋。我們不能僅僅在第一次通過時定義col2和col3的最小值和最大值,而不是if和else語句。 – Amit