2017-06-08 8 views
-4

列2の値と列3の値を行間で比較しようとしています。比較は、同じ行の2列目と3列目の値の比較ではありません。比較のための 条件は比較値は同じ文字列に関連付けられます

(1)1行のCOL2の値がこれらの行は、列の同じ文字列を有する別の行におけるCOL 3の値と比較される1

(2)列1の文字列が少なくとも2回繰り返される場合にのみ比較されます。

(3)カラム2の値が異なる行の列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'は2行で表示されますが、col2の値は他の行のcol3の値よりも小さくなります。つまり、10は300未満、100は400未満です。 2列目のブルースは520のcol2を持ち、もう1つの行のcol3の500よりも大きいためです。

awkで試したところ、以下の例があります。私は最初だけ繰り返し行を印刷した後、関連する値を比較することにより、私はまた、工程で、それに試み

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 

COL1に同じ文字列を有する別の行にCOL3でCOL2を比較把握することができないように見えます。 同じ文字列に関連付けられた値を比較する方法を理解できません。

+1

は、なぜあなたはあなた*のtest.fileは、コマンドラインで、* 2回に対処したのか?私はどのルールが* dexter *を保つのか分からない!あなたは書きました:列2の*値が列3 *の値よりも大きいですが、私はあなたのサンプルでこれに一致する行が1つも見当たりません。 –

+1

なぜファイルを2回置くのか理解していますが、@ F.Hauriの他の質問は非常に重要です:_どのルールが脱調していますか?_「あなたは書きました:列2の値が列3の値よりも大きいです。あなたのサンプルで、これにマッチする1行を参照してください。 " – jas

+0

少なくとも2回繰り返される列1の文字を出力するには、arrayを使用してファイルを2回渡します。より多くの方法があると私は同意します。元の質問ではっきりしないと申し訳ありません。列1の同じ文字列に関連付けられている場合に限り、列2と3の値を行間で比較する必要があります。 – Amit

答えて

1

あなたが試みたとおり、私たちはファイルを2回通過します。最初の例では、それぞれの人に対して、column_2の最大値とcolumn_3のmin値とともに、発生数を取得します。 2回目のパスでは、印刷の条件をテストするだけです。

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の最小値と最大値を定義するだけでは不十分です。 – Amit

関連する問題